/ Hex Artifact Content
Login

Artifact 8853e6dab83f485d3f61a61f9d9a1975ab20b6af:


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 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3a80: 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f  MIT_CONCURRENT./
3a90: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
3aa0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 2d 20 42  ng structure - B
3ab0: 74 72 65 65 50 74 72 6d 61 70 20 2d 20 73 74 6f  treePtrmap - sto
3ac0: 72 65 73 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  res the in-memor
3ad0: 79 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a  y pointer map.**
3ae0: 20 75 73 65 64 20 66 6f 72 20 6e 65 77 6c 79 20   used for newly 
3af0: 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73 20  allocated pages 
3b00: 69 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72  in CONCURRENT tr
3b10: 61 6e 73 61 63 74 69 6f 6e 73 2e 20 53 75 63 68  ansactions. Such
3b20: 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
3b30: 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  ways allocated i
3b40: 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20 62  n a contiguous b
3b50: 6c 6f 63 6b 20 28 66 72 6f 6d 20 74 68 65 20 65  lock (from the e
3b60: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 29 20  nd of the file) 
3b70: 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68  starting.** with
3b80: 20 70 61 67 65 20 42 74 72 65 65 50 74 72 6d 61   page BtreePtrma
3b90: 70 2e 69 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70  p.iFirst..*/.typ
3ba0: 65 64 65 66 20 73 74 72 75 63 74 20 52 6f 6c 6c  edef struct Roll
3bb0: 62 61 63 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61  backEntry Rollba
3bc0: 63 6b 45 6e 74 72 79 3b 0a 74 79 70 65 64 65 66  ckEntry;.typedef
3bd0: 20 73 74 72 75 63 74 20 50 74 72 6d 61 70 45 6e   struct PtrmapEn
3be0: 74 72 79 20 50 74 72 6d 61 70 45 6e 74 72 79 3b  try PtrmapEntry;
3bf0: 0a 73 74 72 75 63 74 20 50 74 72 6d 61 70 45 6e  .struct PtrmapEn
3c00: 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72  try {.  Pgno par
3c10: 65 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b  ent;.  u8 eType;
3c20: 0a 7d 3b 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62  .};.struct Rollb
3c30: 61 63 6b 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e  ackEntry {.  Pgn
3c40: 6f 20 70 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70  o pgno;.  Pgno p
3c50: 61 72 65 6e 74 3b 0a 20 20 75 38 20 65 54 79 70  arent;.  u8 eTyp
3c60: 65 3b 0a 7d 3b 0a 73 74 72 75 63 74 20 42 74 72  e;.};.struct Btr
3c70: 65 65 50 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e  eePtrmap {.  Pgn
3c80: 6f 20 69 46 69 72 73 74 3b 20 20 20 20 20 20 20  o iFirst;       
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ca0: 46 69 72 73 74 20 6e 65 77 20 70 61 67 65 20 6e  First new page n
3cb0: 75 6d 62 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f  umber aPtr[0] */
3cc0: 0a 0a 20 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f  ..  int nPtrAllo
3cd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3ce0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3cf0: 20 73 69 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20   size of aPtr[] 
3d00: 61 72 72 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61  array */.  Ptrma
3d10: 70 45 6e 74 72 79 20 2a 61 50 74 72 3b 20 20 20  pEntry *aPtr;   
3d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
3d30: 72 61 79 20 6f 66 20 70 61 72 65 6e 74 20 70 61  ray of parent pa
3d40: 67 65 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20  ge numbers */.. 
3d50: 20 69 6e 74 20 6e 53 76 70 74 3b 20 20 20 20 20   int nSvpt;     
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 2f 2a 20 55 73 65 64 20 73 69 7a 65 20 6f 66   /* Used size of
3d80: 20 61 53 76 70 74 5b 5d 20 61 72 72 61 79 20 2a   aSvpt[] array *
3d90: 2f 0a 20 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c  /.  int nSvptAll
3da0: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
3db0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3dc0: 20 73 69 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d   size of aSvpt[]
3dd0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 76 70 74   */.  int *aSvpt
3de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3df0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
3e00: 52 6f 6c 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79  Rollback[] entry
3e10: 20 66 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 69   for savepoint i
3e20: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c   */..  int nRoll
3e30: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
3e40: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73         /* Used s
3e50: 69 7a 65 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b  ize of aRollback
3e60: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  [] array */.  in
3e70: 74 20 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63  t nRollbackAlloc
3e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3e90: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
3ea0: 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61  of aRollback[] a
3eb0: 72 72 61 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61  rray */.  Rollba
3ec0: 63 6b 45 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61  ckEntry *aRollba
3ed0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ck;       /* Arr
3ee0: 61 79 20 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65  ay of rollback e
3ef0: 6e 74 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ntries */.};../*
3f00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3f10: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
3f20: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ).**.** If page 
3f30: 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 73 20 67  number pgno is g
3f40: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
3f50: 71 75 61 6c 20 74 6f 20 42 74 72 65 65 50 74 72  qual to BtreePtr
3f60: 6d 61 70 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20  map.iFirst, .** 
3f70: 73 74 6f 72 65 20 61 6e 20 65 6e 74 72 79 20 66  store an entry f
3f80: 6f 72 20 69 74 20 69 6e 20 74 68 65 20 70 6f 69  or it in the poi
3f90: 6e 74 65 72 2d 6d 61 70 20 73 74 72 75 63 74 75  nter-map structu
3fa0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
3fb0: 74 20 62 74 72 65 65 50 74 72 6d 61 70 53 74 6f  t btreePtrmapSto
3fc0: 72 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  re(.  BtShared *
3fd0: 70 42 74 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt,.  Pgno pgno
3fe0: 2c 0a 20 20 75 38 20 65 54 79 70 65 2c 20 0a 20  ,.  u8 eType, . 
3ff0: 20 50 67 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a   Pgno parent.){.
4000: 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70    BtreePtrmap *p
4010: 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b  Map = pBt->pMap;
4020: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61  .  if( pgno>=pMa
4030: 70 2d 3e 69 46 69 72 73 74 20 29 7b 0a 20 20 20  p->iFirst ){.   
4040: 20 69 6e 74 20 69 45 6e 74 72 79 20 3d 20 70 67   int iEntry = pg
4050: 6e 6f 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73  no - pMap->iFirs
4060: 74 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20  t;..    /* Grow 
4070: 74 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79  the aPtr[] array
4080: 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   as required */.
4090: 20 20 20 20 77 68 69 6c 65 28 20 69 45 6e 74 72      while( iEntr
40a0: 79 3e 3d 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  y>=pMap->nPtrAll
40b0: 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  oc ){.      int 
40c0: 6e 4e 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74  nNew = pMap->nPt
40d0: 72 41 6c 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e  rAlloc ? pMap->n
40e0: 50 74 72 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b  PtrAlloc*2 : 16;
40f0: 0a 20 20 20 20 20 20 50 74 72 6d 61 70 45 6e 74  .      PtrmapEnt
4100: 72 79 20 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d  ry *aNew = (Ptrm
4110: 61 70 45 6e 74 72 79 2a 29 73 71 6c 69 74 65 33  apEntry*)sqlite3
4120: 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
4130: 20 20 20 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20      pMap->aPtr, 
4140: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d  nNew*sizeof(Ptrm
4150: 61 70 45 6e 74 72 79 29 0a 20 20 20 20 20 20 29  apEntry).      )
4160: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77  ;.      if( aNew
4170: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
4180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
4190: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
41a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
41b0: 74 65 20 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d  te = (nNew-pMap-
41c0: 3e 6e 50 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65  >nPtrAlloc)*size
41d0: 6f 66 28 50 74 72 6d 61 70 45 6e 74 72 79 29 3b  of(PtrmapEntry);
41e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
41f0: 26 61 4e 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72  &aNew[pMap->nPtr
4200: 41 6c 6c 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65  Alloc], 0, nByte
4210: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d  );.        pMap-
4220: 3e 61 50 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20  >aPtr = aNew;.  
4230: 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72        pMap->nPtr
4240: 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20  Alloc = nNew;.  
4250: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
4260: 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79   /* Add an entry
4270: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
4280: 20 6c 6f 67 20 69 66 20 72 65 71 75 69 72 65 64   log if required
4290: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4d 61 70   */.    if( pMap
42a0: 2d 3e 6e 53 76 70 74 3e 30 20 26 26 20 70 4d 61  ->nSvpt>0 && pMa
42b0: 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e  p->aPtr[iEntry].
42c0: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  parent ){.      
42d0: 69 66 28 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  if( pMap->nRollb
42e0: 61 63 6b 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c  ack>=pMap->nRoll
42f0: 62 61 63 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  backAlloc ){.   
4300: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
4310: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20  pMap->nRollback 
4320: 3f 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  ? pMap->nRollbac
4330: 6b 2a 32 20 3a 20 31 36 3b 0a 20 20 20 20 20 20  k*2 : 16;.      
4340: 20 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20    RollbackEntry 
4350: 2a 61 4e 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63  *aNew = (Rollbac
4360: 6b 45 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f  kEntry*)sqlite3_
4370: 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
4380: 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c       pMap->aRoll
4390: 62 61 63 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f  back, nNew*sizeo
43a0: 66 28 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29  f(RollbackEntry)
43b0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
43c0: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
43d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
43e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
43f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
4400: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d  .          pMap-
4410: 3e 61 52 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65  >aRollback = aNe
4420: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  w;.          pMa
4430: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f  p->nRollbackAllo
4440: 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  c = nNew;.      
4450: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
4460: 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61     pMap->aRollba
4470: 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61  ck[pMap->nRollba
4480: 63 6b 5d 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ck].pgno = pgno;
4490: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f  .      pMap->aRo
44a0: 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f  llback[pMap->nRo
44b0: 6c 6c 62 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d  llback].parent =
44c0: 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74   pMap->aPtr[iEnt
44d0: 72 79 5d 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20  ry].parent;.    
44e0: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
44f0: 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  k[pMap->nRollbac
4500: 6b 5d 2e 65 54 79 70 65 20 3d 20 70 4d 61 70 2d  k].eType = pMap-
4510: 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54  >aPtr[iEntry].eT
4520: 79 70 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ype;.    }..    
4530: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 50  /* Update the aP
4540: 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  tr[] array */.  
4550: 20 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e    pMap->aPtr[iEn
4560: 74 72 79 5d 2e 70 61 72 65 6e 74 20 3d 20 70 61  try].parent = pa
4570: 72 65 6e 74 3b 0a 20 20 20 20 70 4d 61 70 2d 3e  rent;.    pMap->
4580: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79  aPtr[iEntry].eTy
4590: 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 7d 0a  pe = eType;.  }.
45a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
45b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69  _OK;.}../* !defi
45c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
45d0: 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a  CONCURRENT).**.*
45e0: 2a 20 4f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * Open savepoint
45f0: 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 69 66 20   iSavepoint, if 
4600: 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
4610: 79 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  y open..*/.stati
4620: 63 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d 61  c int btreePtrma
4630: 70 42 65 67 69 6e 28 42 74 53 68 61 72 65 64 20  pBegin(BtShared 
4640: 2a 70 42 74 2c 20 69 6e 74 20 6e 53 76 70 74 29  *pBt, int nSvpt)
4650: 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70 20  {.  BtreePtrmap 
4660: 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61  *pMap = pBt->pMa
4670: 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 26 26  p;.  if( pMap &&
4680: 20 6e 53 76 70 74 3c 70 4d 61 70 2d 3e 6e 53 76   nSvpt<pMap->nSv
4690: 70 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  pt ){.    int i;
46a0: 0a 20 20 20 20 69 66 28 20 6e 53 76 70 74 3e 3d  .    if( nSvpt>=
46b0: 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63  pMap->nSvptAlloc
46c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
46d0: 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 53 76 70 74  ew = pMap->nSvpt
46e0: 41 6c 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 53  Alloc ? pMap->nS
46f0: 76 70 74 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b  vptAlloc*2 : 16;
4700: 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  .      int *aNew
4710: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
4720: 6f 63 28 70 4d 61 70 2d 3e 61 53 76 70 74 2c 20  oc(pMap->aSvpt, 
4730: 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 6e 4e  sizeof(int) * nN
4740: 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ew);.      if( a
4750: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
4760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4770: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
4780: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 61 70  se{.        pMap
4790: 2d 3e 61 53 76 70 74 20 3d 20 61 4e 65 77 3b 0a  ->aSvpt = aNew;.
47a0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 53          pMap->nS
47b0: 76 70 74 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b  vptAlloc = nNew;
47c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
47d0: 20 20 20 20 66 6f 72 28 69 3d 70 4d 61 70 2d 3e      for(i=pMap->
47e0: 6e 53 76 70 74 3b 20 69 3c 6e 53 76 70 74 3b 20  nSvpt; i<nSvpt; 
47f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d 61 70  i++){.      pMap
4800: 2d 3e 61 53 76 70 74 5b 69 5d 20 3d 20 70 4d 61  ->aSvpt[i] = pMa
4810: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20  p->nRollback;.  
4820: 20 20 7d 0a 20 20 20 20 70 4d 61 70 2d 3e 6e 53    }.    pMap->nS
4830: 76 70 74 20 3d 20 6e 53 76 70 74 3b 0a 20 20 7d  vpt = nSvpt;.  }
4840: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
4850: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66  E_OK;.}../* !def
4860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4870: 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a  _CONCURRENT).**.
4880: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 28 69 66 20  ** Rollback (if 
4890: 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
48a0: 4c 4c 42 41 43 4b 29 20 6f 72 20 72 65 6c 65 61  LLBACK) or relea
48b0: 73 65 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50  se (if op==SAVEP
48c0: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 0a 2a 2a  OINT_RELEASE).**
48d0: 20 73 61 76 65 70 6f 69 6e 74 20 69 53 76 70 74   savepoint iSvpt
48e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
48f0: 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e 64 28   btreePtrmapEnd(
4900: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
4910: 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 76 70 74  nt op, int iSvpt
4920: 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70  ){.  BtreePtrmap
4930: 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d   *pMap = pBt->pM
4940: 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 29  ap;.  if( pMap )
4950: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  {.    assert( op
4960: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
4970: 42 41 43 4b 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  BACK || op==SAVE
4980: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 3b  POINT_RELEASE );
4990: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 76  .    assert( iSv
49a0: 70 74 3e 3d 30 20 7c 7c 20 28 69 53 76 70 74 3d  pt>=0 || (iSvpt=
49b0: 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
49c0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
49d0: 3b 0a 20 20 20 20 69 66 28 20 69 53 76 70 74 3c  ;.    if( iSvpt<
49e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4d 61 70 2d  0 ){.      pMap-
49f0: 3e 6e 53 76 70 74 20 3d 20 30 3b 0a 20 20 20 20  >nSvpt = 0;.    
4a00: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4a10: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d  k = 0;.      mem
4a20: 73 65 74 28 70 4d 61 70 2d 3e 61 50 74 72 2c 20  set(pMap->aPtr, 
4a30: 30 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20  0, sizeof(Pgno) 
4a40: 2a 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f  * pMap->nPtrAllo
4a50: 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  c);.    }else if
4a60: 28 20 69 53 76 70 74 3c 70 4d 61 70 2d 3e 6e 53  ( iSvpt<pMap->nS
4a70: 76 70 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  vpt ){.      if(
4a80: 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
4a90: 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
4aa0: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
4ab0: 20 20 20 66 6f 72 28 69 69 3d 70 4d 61 70 2d 3e     for(ii=pMap->
4ac0: 6e 52 6f 6c 6c 62 61 63 6b 2d 31 3b 20 69 69 3e  nRollback-1; ii>
4ad0: 3d 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 53 76  =pMap->aSvpt[iSv
4ae0: 70 74 5d 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20  pt]; ii--){.    
4af0: 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45 6e        RollbackEn
4b00: 74 72 79 20 2a 70 20 3d 20 26 70 4d 61 70 2d 3e  try *p = &pMap->
4b10: 61 52 6f 6c 6c 62 61 63 6b 5b 69 69 5d 3b 0a 20  aRollback[ii];. 
4b20: 20 20 20 20 20 20 20 20 20 50 74 72 6d 61 70 45           PtrmapE
4b30: 6e 74 72 79 20 2a 70 45 6e 74 72 79 20 3d 20 26  ntry *pEntry = &
4b40: 70 4d 61 70 2d 3e 61 50 74 72 5b 70 2d 3e 70 67  pMap->aPtr[p->pg
4b50: 6e 6f 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73  no - pMap->iFirs
4b60: 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  t];.          pE
4b70: 6e 74 72 79 2d 3e 70 61 72 65 6e 74 20 3d 20 70  ntry->parent = p
4b80: 2d 3e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20  ->parent;.      
4b90: 20 20 20 20 70 45 6e 74 72 79 2d 3e 65 54 79 70      pEntry->eTyp
4ba0: 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20  e = p->eType;.  
4bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4bc0: 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 53 76 70        pMap->nSvp
4bd0: 74 20 3d 20 69 53 76 70 74 20 2b 20 28 6f 70 3d  t = iSvpt + (op=
4be0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
4bf0: 41 43 4b 29 3b 0a 20 20 20 20 20 20 70 4d 61 70  ACK);.      pMap
4c00: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3d 20 70 4d  ->nRollback = pM
4c10: 61 70 2d 3e 61 53 76 70 74 5b 69 53 76 70 74 5d  ap->aSvpt[iSvpt]
4c20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
4c30: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4c40: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4c50: 54 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  T).**.** This fu
4c60: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4c70: 20 61 66 74 65 72 20 61 6e 20 43 4f 4e 43 55 52   after an CONCUR
4c80: 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e  RENT transaction
4c90: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
4ca0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49  e.** database. I
4cb0: 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20  t allocates the 
4cc0: 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72 75  BtreePtrmap stru
4cd0: 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 74 72  cture used to tr
4ce0: 61 63 6b 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  ack pointers.** 
4cf0: 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  to allocated pag
4d00: 65 73 20 61 6e 64 20 7a 65 72 6f 65 73 20 74 68  es and zeroes th
4d10: 65 20 6e 46 72 65 65 2f 69 54 72 75 6e 6b 20 66  e nFree/iTrunk f
4d20: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 64 61 74  ields in the dat
4d30: 61 62 61 73 65 20 0a 2a 2a 20 68 65 61 64 65 72  abase .** header
4d40: 20 6f 6e 20 70 61 67 65 20 31 2e 0a 2a 2f 0a 73   on page 1..*/.s
4d50: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50  tatic int btreeP
4d60: 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 42 74  trmapAllocate(Bt
4d70: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
4d80: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4d90: 4f 4b 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  OK;.  if( pBt->p
4da0: 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 42 74  Map==0 ){.    Bt
4db0: 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20  reePtrmap *pMap 
4dc0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
4dd0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 50 74 72  (sizeof(BtreePtr
4de0: 6d 61 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70  map));.    if( p
4df0: 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Map==0 ){.      
4e00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
4e10: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
4e20: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 42 74 2d      memset(&pBt-
4e30: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
4e40: 32 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33  2], 0, sizeof(u3
4e50: 32 29 2a 32 29 3b 0a 20 20 20 20 20 20 6d 65 6d  2)*2);.      mem
4e60: 73 65 74 28 70 4d 61 70 2c 20 30 2c 20 73 69 7a  set(pMap, 0, siz
4e70: 65 6f 66 28 42 74 72 65 65 50 74 72 6d 61 70 29  eof(BtreePtrmap)
4e80: 29 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 69  );.      pMap->i
4e90: 46 69 72 73 74 20 3d 20 70 42 74 2d 3e 6e 50 61  First = pBt->nPa
4ea0: 67 65 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 42  ge + 1;.      pB
4eb0: 74 2d 3e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a  t->pMap = pMap;.
4ec0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4ed0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65  rn rc;.}../* !de
4ee0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4ef0: 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a  T_CONCURRENT).**
4f00: 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 42 74 72  .** Free any Btr
4f10: 65 65 50 74 72 6d 61 70 20 73 74 72 75 63 74 75  eePtrmap structu
4f20: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  re allocated by 
4f30: 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
4f40: 74 6f 0a 2a 2a 20 62 74 72 65 65 50 74 72 6d 61  to.** btreePtrma
4f50: 70 41 6c 6c 6f 63 61 74 65 28 29 2e 0a 2a 2f 0a  pAllocate()..*/.
4f60: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
4f70: 65 50 74 72 6d 61 70 44 65 6c 65 74 65 28 42 74  ePtrmapDelete(Bt
4f80: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
4f90: 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61  BtreePtrmap *pMa
4fa0: 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20  p = pBt->pMap;. 
4fb0: 20 69 66 28 20 70 4d 61 70 20 29 7b 0a 20 20 20   if( pMap ){.   
4fc0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
4fd0: 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 29 3b 0a  ap->aRollback);.
4fe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4ff0: 28 70 4d 61 70 2d 3e 61 50 74 72 29 3b 0a 20 20  (pMap->aPtr);.  
5000: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5010: 4d 61 70 2d 3e 61 53 76 70 74 29 3b 0a 20 20 20  Map->aSvpt);.   
5020: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
5030: 61 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4d  ap);.    pBt->pM
5040: 61 70 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  ap = 0;.  }.}.#e
5050: 6c 73 65 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  lse  /* SQLITE_O
5060: 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a  MIT_CONCURRENT *
5070: 2f 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65  /.# define btree
5080: 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 78  PtrmapAllocate(x
5090: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65  ) SQLITE_OK.# de
50a0: 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70  fine btreePtrmap
50b0: 44 65 6c 65 74 65 28 78 29 20 0a 23 20 64 65 66  Delete(x) .# def
50c0: 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 42  ine btreePtrmapB
50d0: 65 67 69 6e 28 78 2c 79 29 20 20 53 51 4c 49 54  egin(x,y)  SQLIT
50e0: 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62 74  E_OK.# define bt
50f0: 72 65 65 50 74 72 6d 61 70 45 6e 64 28 78 2c 79  reePtrmapEnd(x,y
5100: 2c 7a 29 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ,z) .#endif /* S
5110: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
5120: 52 52 45 4e 54 20 2a 2f 0a 0a 73 74 61 74 69 63  RRENT */..static
5130: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
5140: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
5150: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
5160: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
5170: 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  ***** This routi
5180: 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  ne is used insid
5190: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e  e of assert() on
51a0: 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65  ly ****.**.** Ve
51b0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75  rify that the cu
51c0: 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d  rsor holds the m
51d0: 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68  utex on its BtSh
51e0: 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ared.*/.#ifdef S
51f0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
5200: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
5210: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
5220: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
5230: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5240: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
5250: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5260: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
5270: 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20   overflow cache 
5280: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61  of the cursor pa
5290: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
52a0: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f  t argument..** o
52b0: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
52c0: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
52d0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76  ..*/.#define inv
52e0: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
52f0: 61 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72  ache(pCur) (pCur
5300: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
5310: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a  TCF_ValidOvfl)..
5320: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
5330: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
5340: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
5350: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
5360: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
5370: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
5380: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
5390: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
53a0: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
53b0: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
53c0: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
53d0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
53e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
53f0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5400: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
5410: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5420: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
5430: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5440: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  e(p);.  }.}..#if
5450: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5460: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
5470: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5480: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
5490: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
54a0: 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65  tents of a table
54b0: 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  .** to invalidat
54c0: 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
54d0: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
54e0: 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  open on the.** r
54f0: 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ow or one of the
5500: 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69   rows being modi
5510: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  fied..**.** If a
5520: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
5530: 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68  able is true, th
5540: 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  en the entire co
5550: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
5560: 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20   table is about 
5570: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49  to be deleted. I
5580: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
5590: 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62  lidate all incrb
55a0: 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  lob.** cursors o
55b0: 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77  pen on any row w
55c0: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ithin the table 
55d0: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70  with root-page p
55e0: 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f  gnoRoot..**.** O
55f0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67  therwise, if arg
5600: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
5610: 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  le is false, the
5620: 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a  n the row with.*
5630: 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20  * rowid iRow is 
5640: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f  being replaced o
5650: 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  r deleted. In th
5660: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
5670: 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65  te.** only those
5680: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
5690: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73  s open on that s
56a0: 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a  pecific row..*/.
56b0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
56c0: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
56d0: 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a  rsors(.  Btree *
56e0: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
56f0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
5700: 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
5710: 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20  /.  i64 iRow,   
5720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5730: 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69  he rowid that mi
5740: 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20  ght be changing 
5750: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72  */.  int isClear
5760: 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20  Table        /* 
5770: 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73  True if all rows
5780: 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74   are being delet
5790: 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72  ed */.){.  BtCur
57a0: 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42  sor *p;.  if( pB
57b0: 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f  tree->hasIncrblo
57c0: 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  bCur==0 ) return
57d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
57e0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
57f0: 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
5800: 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62  pBtree->hasIncrb
5810: 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f  lobCur = 0;.  fo
5820: 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
5830: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5840: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5850: 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26  ( (p->curFlags &
5860: 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21   BTCF_Incrblob)!
5870: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72  =0 ){.      pBtr
5880: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
5890: 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  ur = 1;.      if
58a0: 28 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c  ( isClearTable |
58b0: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
58c0: 69 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  iRow ){.        
58d0: 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
58e0: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
58f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
5900: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
5910: 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49   function when I
5920: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
5930: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
5940: 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
5950: 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29  obCursors(x,y,z)
5960: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5970: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20  E_OMIT_INCRBLOB 
5980: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69  */../*.** Set bi
5990: 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74  t pgno of the Bt
59a0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
59b0: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
59c0: 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68  is called .** wh
59d0: 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 70  en a page that p
59e0: 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69  reviously contai
59f0: 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73  ned data becomes
5a00: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
5a10: 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a  f .** page..**.*
5a20: 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e 70  * The BtShared.p
5a30: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
5a40: 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b  c exists to work
5a50: 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75   around an obscu
5a60: 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64  re.** bug caused
5a70: 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63 74   by the interact
5a80: 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75  ion of two usefu
5a90: 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f  l IO optimizatio
5aa0: 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a  ns surrounding.*
5ab0: 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  * free-list leaf
5ac0: 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   pages:.**.**   
5ad0: 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61  1) When all data
5ae0: 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   is deleted from
5af0: 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65 20   a page and the 
5b00: 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20  page becomes.** 
5b10: 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74       a free-list
5b20: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
5b30: 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74  page is not writ
5b40: 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
5b50: 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  ase.**      (as 
5b60: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
5b70: 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20  ages contain no 
5b80: 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29  meaningful data)
5b90: 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20  . Sometimes.**  
5ba0: 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65 20      such a page 
5bb0: 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72  is not even jour
5bc0: 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69  nalled (as it wi
5bd0: 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  ll not be modifi
5be0: 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20  ed,.**      why 
5bf0: 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69  bother journalli
5c00: 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20  ng it?)..**.**  
5c10: 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d   2) When a free-
5c20: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69  list leaf page i
5c30: 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f  s reused, its co
5c40: 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61  ntent is not rea
5c50: 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
5c60: 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 77  he database or w
5c70: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
5c80: 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20  urnal file (why 
5c90: 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20  should it.**    
5ca0: 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e    be, if it is n
5cb0: 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e  ot at all meanin
5cc0: 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79  gful?)..**.** By
5cd0: 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65   themselves, the
5ce0: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  se optimizations
5cf0: 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70   work fine and p
5d00: 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a  rovide a handy.*
5d10: 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  * performance bo
5d20: 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65  ost to bulk dele
5d30: 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65  te or insert ope
5d40: 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72  rations. However
5d50: 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69  , if.** a page i
5d60: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
5d70: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65  ree-list and the
5d80: 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e 20  n reused within 
5d90: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e  the same.** tran
5da0: 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c  saction, a probl
5db0: 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20  em comes up. If 
5dc0: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
5dd0: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a  journalled when.
5de0: 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74  ** it is moved t
5df0: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
5e00: 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  and it is also n
5e10: 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68  ot journalled wh
5e20: 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72  en it.** is extr
5e30: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
5e40: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75  ree-list and reu
5e50: 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  sed, then the or
5e60: 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d  iginal data.** m
5e70: 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74  ay be lost. In t
5e80: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
5e90: 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e  llback, it may n
5ea0: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a  ot be possible.*
5eb0: 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  * to restore the
5ec0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
5ed0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67   original config
5ee0: 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  uration..**.** T
5ef0: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
5f00: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
5f10: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
5f20: 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65 20  Whenever a page 
5f30: 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20  is .** moved to 
5f40: 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69  become a free-li
5f50: 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68  st leaf page, th
5f60: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
5f70: 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e  bit is.** set in
5f80: 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68 65   the bitvec. Whe
5f90: 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61 67  never a leaf pag
5fa0: 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
5fb0: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
5fc0: 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  t,.** optimizati
5fd0: 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d  on 2 above is om
5fe0: 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f 72  itted if the cor
5ff0: 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
6000: 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74  s already.** set
6010: 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61   in BtShared.pHa
6020: 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f  sContent. The co
6030: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69  ntents of the bi
6040: 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65 64  tvec are cleared
6050: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
6060: 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63 74  f every transact
6070: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
6080: 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43 6f  nt btreeSetHasCo
6090: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
60a0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
60b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
60c0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42  TE_OK;.  if( !pB
60d0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29  t->pHasContent )
60e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  {.    assert( pg
60f0: 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29  no<=pBt->nPage )
6100: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43  ;.    pBt->pHasC
6110: 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  ontent = sqlite3
6120: 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42 74  BitvecCreate(pBt
6130: 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66  ->nPage);.    if
6140: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
6150: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ent ){.      rc 
6160: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6180: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6190: 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69   pgno<=sqlite3Bi
61a0: 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48  tvecSize(pBt->pH
61b0: 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20  asContent) ){.  
61c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
61d0: 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61  tvecSet(pBt->pHa
61e0: 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b  sContent, pgno);
61f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6200: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79  ;.}../*.** Query
6210: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
6220: 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72  asContent vector
6230: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
6240: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
6250: 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  when a free-list
6260: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
6270: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  moved from the.*
6280: 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20  * free-list for 
6290: 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e  reuse. It return
62a0: 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  s false if it is
62b0: 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65 76   safe to retriev
62c0: 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72  e the.** page fr
62d0: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
62e0: 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
62f0: 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
6300: 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69 73  t. True otherwis
6310: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6320: 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74   btreeGetHasCont
6330: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
6340: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
6350: 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74   Bitvec *p = pBt
6360: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20  ->pHasContent;. 
6370: 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70   return (p && (p
6380: 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65  gno>sqlite3Bitve
6390: 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69  cSize(p) || sqli
63a0: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2c  te3BitvecTest(p,
63b0: 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a   pgno)));.}../*.
63c0: 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f  ** Clear (destro
63d0: 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  y) the BtShared.
63e0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
63f0: 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ec. This should 
6400: 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74  be.** invoked at
6410: 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
6420: 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74 72  of each write-tr
6430: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
6440: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43  atic void btreeC
6450: 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42  learHasContent(B
6460: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
6470: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
6480: 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43  stroy(pBt->pHasC
6490: 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e  ontent);.  pBt->
64a0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b  pHasContent = 0;
64b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
64c0: 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70 50  e all of the apP
64d0: 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72 20  age[] pages for 
64e0: 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  a cursor..*/.sta
64f0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52 65  tic void btreeRe
6500: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
6510: 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ges(BtCursor *pC
6520: 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
6530: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
6540: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
6550: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
6560: 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
6570: 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
6580: 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  e[i] = 0;.  }.  
6590: 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
65a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
65b0: 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20  ursor passed as 
65c0: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
65d0: 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  t must point to 
65e0: 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a  a valid entry.**
65f0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
6600: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69  ion is called (i
6610: 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d  .e. have eState=
6620: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20  =CURSOR_VALID). 
6630: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
6640: 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72 65   saves the curre
6650: 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e  nt cursor key in
6660: 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d   variables pCur-
6670: 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75  >nKey and.** pCu
6680: 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f  r->pKey. SQLITE_
6690: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
66a0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  f successful or 
66b0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
66c0: 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
66d0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
66e0: 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
66f0: 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62  on an intkey tab
6700: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74  le, then the int
6710: 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65  eger key.** (the
6720: 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65   rowid) is store
6730: 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20  d in pCur->nKey 
6740: 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69  and pCur->pKey i
6750: 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a  s left set to.**
6760: 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75   NULL. If the cu
6770: 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20  rsor is open on 
6780: 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62  a non-intkey tab
6790: 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70  le, then pCur->p
67a0: 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74  Key is .** set t
67b0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c  o point to a mal
67c0: 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43 75  loced buffer pCu
67d0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e  r->nKey bytes in
67e0: 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
67f0: 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f   .** the key..*/
6800: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
6810: 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73  CursorKey(BtCurs
6820: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
6830: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 43   rc;.  assert( C
6840: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
6850: 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61  r->eState );.  a
6860: 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e  ssert( 0==pCur->
6870: 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  pKey );.  assert
6880: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
6890: 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72  ex(pCur) );..  r
68a0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
68b0: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70  KeySize(pCur, &p
68c0: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73  Cur->nKey);.  as
68d0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
68e0: 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69  _OK );  /* KeySi
68f0: 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ze() cannot fail
6900: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
6910: 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74  s is an intKey t
6920: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61  able, then the a
6930: 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72  bove call to Btr
6940: 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a  eeKeySize().  **
6950: 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65   stores the inte
6960: 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d  ger key in pCur-
6970: 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63  >nKey. In this c
6980: 61 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69  ase this value i
6990: 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20  s.  ** all that 
69a0: 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  is required. Oth
69b0: 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20  erwise, if pCur 
69c0: 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61  is not open on a
69d0: 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61  n intKey.  ** ta
69e0: 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63  ble, then malloc
69f0: 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73   space for and s
6a00: 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e  tore the pCur->n
6a10: 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79  Key bytes of key
6a20: 20 0a 20 20 2a 2a 20 64 61 74 61 2e 20 20 2a 2f   .  ** data.  */
6a30: 0a 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e  .  if( 0==pCur->
6a40: 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20  curIntKey ){.   
6a50: 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71   void *pKey = sq
6a60: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75  lite3Malloc( pCu
6a70: 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69  r->nKey );.    i
6a80: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
6a90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
6aa0: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
6ab0: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  int)pCur->nKey, 
6ac0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
6ad0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6ae0: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
6af0: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
6b00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6b10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6b20: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
6b30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
6b40: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6b50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
6b60: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
6b70: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
6b80: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
6b90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
6ba0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
6bb0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
6bc0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
6bd0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
6be0: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
6bf0: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
6c00: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
6c10: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
6c20: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
6c30: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
6c40: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
6c50: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
6c60: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
6c70: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
6c80: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
6c90: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
6ca0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
6cb0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
6cc0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
6cd0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
6ce0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
6cf0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
6d00: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
6d10: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
6d20: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
6d30: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
6d40: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6d50: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6d60: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
6d70: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
6d80: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
6d90: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6da0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
6db0: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
6dc0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
6dd0: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
6de0: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
6df0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6e00: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
6e10: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
6e20: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
6e30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6e40: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
6e50: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
6e60: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
6e70: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
6e80: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6e90: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6ea0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6eb0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6ec0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6ed0: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6ee0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6ef0: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
6f00: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
6f10: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
6f20: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
6f30: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
6f40: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
6f50: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
6f60: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
6f70: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
6f80: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6f90: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6fa0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6fb0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6fc0: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6fd0: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6fe0: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6ff0: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
7000: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
7010: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
7020: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
7030: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7040: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
7050: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
7060: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
7070: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
7080: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
7090: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
70a0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
70b0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
70c0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
70d0: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
70e0: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
70f0: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
7100: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
7110: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
7120: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
7130: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
7140: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
7150: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
7160: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
7170: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
7180: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
7190: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
71a0: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
71b0: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
71c0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
71d0: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
71e0: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
71f0: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
7200: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
7210: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
7220: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
7230: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
7240: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
7250: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
7260: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
7270: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
7280: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
7290: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
72a0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
72b0: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
72c0: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
72d0: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
72e0: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
72f0: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
7300: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
7310: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
7320: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
7330: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
7340: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
7350: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
7360: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
7370: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
7380: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
7390: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
73a0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
73b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
73c0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
73d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
73e0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
73f0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
7400: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
7410: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
7420: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
7430: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
7440: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
7450: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
7460: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
7470: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
7480: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
7490: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
74a0: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
74b0: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
74c0: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
74d0: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
74e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
74f0: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
7500: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
7510: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
7520: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
7530: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
7540: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
7550: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
7560: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
7570: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
7580: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
7590: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
75a0: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
75b0: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
75c0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
75d0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
75e0: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
75f0: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
7600: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
7610: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
7620: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
7630: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
7640: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
7650: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
7660: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
7670: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
7680: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
7690: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
76a0: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
76b0: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
76c0: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
76d0: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
76e0: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
76f0: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
7700: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
7710: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
7720: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
7730: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
7740: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
7750: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
7760: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
7770: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
7780: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
7790: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
77a0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
77b0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
77c0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
77d0: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
77e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
77f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
7800: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
7810: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
7820: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
7830: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
7840: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
7850: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
7860: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
7870: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
7880: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7890: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
78a0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
78b0: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
78c0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
78d0: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
78e0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
78f0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
7900: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
7910: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
7920: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
7930: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
7940: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
7950: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
7960: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
7970: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
7980: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
7990: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
79a0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
79b0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
79c0: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
79d0: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
79e0: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
79f0: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
7a00: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
7a10: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
7a20: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
7a30: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
7a40: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
7a50: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
7a60: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
7a70: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
7a80: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
7a90: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
7aa0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
7ab0: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
7ac0: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
7ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
7ae0: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
7af0: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
7b00: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
7b10: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
7b20: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
7b30: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
7b40: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
7b50: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
7b60: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
7b70: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
7b80: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ba0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
7bb0: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
7bc0: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
7bd0: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
7be0: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
7bf0: 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20  pace[200];      
7c00: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
7c10: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
7c20: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
7c30: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
7c40: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
7c50: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
7c60: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
7c70: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
7c80: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
7c90: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
7ca0: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
7cb0: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
7cc0: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
7cd0: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
7ce0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
7cf0: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
7d00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
7d10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7d20: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
7d30: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
7d40: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
7d50: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
7d60: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
7d70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
7d80: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
7d90: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
7da0: 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ree);.      retu
7db0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7dc0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
7dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
7de0: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
7df0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
7e00: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
7e10: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
7e20: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
7e30: 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
7e40: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7e50: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
7e60: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d  >db, pFree);.  }
7e70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7e80: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
7e90: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
7ea0: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
7eb0: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
7ec0: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
7ed0: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
7ee0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
7ef0: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
7f00: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
7f10: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
7f20: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
7f30: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
7f40: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
7f50: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
7f60: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
7f70: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
7f80: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
7f90: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
7fa0: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
7fb0: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
7fc0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
7fd0: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
7fe0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
7ff0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
8000: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
8010: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
8020: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
8030: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8040: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
8050: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
8060: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
8070: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
8080: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
8090: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
80a0: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
80b0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
80c0: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
80d0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
80e0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
80f0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
8100: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
8110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8120: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8130: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
8140: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
8150: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
8160: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
8170: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
8180: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
8190: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
81a0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
81b0: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
81c0: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
81d0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
81e0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
81f0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
8200: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
8210: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
8220: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8230: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
8240: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8250: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
8260: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
8270: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
8280: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
8290: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
82a0: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
82b0: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
82c0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
82d0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
82e0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
82f0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
8300: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
8310: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
8320: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
8330: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
8340: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
8350: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
8360: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
8370: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
8380: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
8390: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
83a0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
83b0: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
83c0: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
83d0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
83e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
83f0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
8400: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
8410: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
8420: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
8430: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
8440: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
8450: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
8460: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
8470: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
8480: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
8490: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
84a0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
84b0: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
84c0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
84d0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
84e0: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
84f0: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
8500: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
8510: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8520: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
8530: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
8540: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
8550: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
8560: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
8570: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
8580: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
8590: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
85a0: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
85b0: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
85c0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
85d0: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
85e0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
85f0: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
8600: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
8610: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
8620: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
8630: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
8640: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
8650: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
8660: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
8670: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
8680: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
8690: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
86a0: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
86b0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
86c0: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
86d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
86e0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
86f0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
8700: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
8710: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
8720: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
8730: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
8740: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
8750: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
8760: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
8770: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
8780: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
8790: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
87a0: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
87b0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
87c0: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
87d0: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
87e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
87f0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
8800: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
8810: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
8820: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
8830: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
8840: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
8850: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
8860: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
8870: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
8880: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
8890: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
88a0: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
88b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
88c0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
88d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
88e0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
88f0: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
8900: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
8910: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
8920: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
8930: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
8940: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
8950: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
8960: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
8970: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
8980: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
8990: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
89a0: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
89b0: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
89c0: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
89d0: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
89e0: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
89f0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
8a00: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
8a10: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
8a20: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
8a30: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
8a40: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
8a50: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
8a60: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
8a70: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
8a80: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
8a90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
8aa0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8ab0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8ac0: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
8ad0: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
8ae0: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
8af0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
8b00: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
8b10: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
8b20: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
8b30: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
8b40: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
8b50: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
8b60: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
8b70: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
8b80: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
8b90: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
8ba0: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
8bb0: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
8bc0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
8bd0: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
8be0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
8bf0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
8c00: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
8c10: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
8c20: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
8c30: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
8c40: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
8c50: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
8c60: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
8c70: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
8c80: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
8c90: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
8ca0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
8cb0: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
8cc0: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
8cd0: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
8ce0: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
8cf0: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
8d00: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
8d10: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
8d20: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
8d30: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
8d40: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
8d50: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
8d60: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
8d70: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
8d80: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8d90: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
8da0: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
8db0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
8dc0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
8dd0: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
8de0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8df0: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
8e00: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
8e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8e20: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
8e30: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
8e40: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
8e50: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
8e60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8e70: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
8e80: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
8e90: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
8ea0: 75 6d 62 65 72 20 69 73 20 6e 65 76 65 72 20 61  umber is never a
8eb0: 64 64 65 64 20 74 6f 20 61 20 70 6f 69 6e 74 65  dded to a pointe
8ec0: 72 2d 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r-map page */.  
8ed0: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
8ee0: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
8ef0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
8f00: 70 42 74 29 29 20 29 3b 0a 0a 23 69 66 6e 64 65  pBt)) );..#ifnde
8f10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
8f20: 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20 70  NCURRENT.  if( p
8f30: 42 74 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20  Bt->pMap ){.    
8f40: 2a 70 52 43 20 3d 20 62 74 72 65 65 50 74 72 6d  *pRC = btreePtrm
8f50: 61 70 53 74 6f 72 65 28 70 42 74 2c 20 6b 65 79  apStore(pBt, key
8f60: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
8f70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8f80: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
8f90: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
8fa0: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
8fb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
8fc0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
8fd0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
8fe0: 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  n;.  }.  iPtrmap
8ff0: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
9000: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
9010: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
9020: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
9030: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
9040: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
9050: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
9060: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
9070: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
9080: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
9090: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
90a0: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
90b0: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
90c0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
90d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
90e0: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
90f0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
9100: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
9110: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
9120: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
9130: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
9140: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
9150: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
9160: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
9170: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
9180: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
9190: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
91a0: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
91b0: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
91c0: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
91d0: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52  arent));.    *pR
91e0: 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  C= rc = sqlite3P
91f0: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
9200: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
9210: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9220: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
9230: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
9240: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
9250: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
9260: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
9270: 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a  }..ptrmap_exit:.
9280: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
9290: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ref(pDbPage);.}.
92a0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
92b0: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
92c0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
92d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
92e0: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
92f0: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
9300: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
9310: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
9320: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
9330: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
9340: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
9350: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
9360: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
9370: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
9380: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
9390: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
93a0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
93b0: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
93c0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
93d0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
93e0: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
93f0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
9400: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
9410: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
9420: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
9430: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
9440: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
9450: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
9460: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
9470: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
9480: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
9490: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
94a0: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
94b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
94c0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
94d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
94e0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
94f0: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
9500: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
9510: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
9520: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
9530: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
9540: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
9550: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
9560: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
9570: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
9580: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
9590: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
95a0: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
95b0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
95c0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
95d0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
95e0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
95f0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
9600: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
9610: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9620: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
9630: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
9640: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
9650: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
9660: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
9670: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
9680: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
9690: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
96a0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
96b0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
96c0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
96d0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
96e0: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
96f0: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
9700: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9710: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
9720: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9730: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
9740: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
9750: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
9760: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
9770: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
9780: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
9790: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
97a0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
97b0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
97c0: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
97d0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
97e0: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
97f0: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
9800: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
9810: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
9820: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
9830: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
9840: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
9850: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
9860: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
9870: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43  ent..**.** findC
9880: 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65  ellPastPtr() doe
9890: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
98a0: 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74 20  t it skips past 
98b0: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34  the initial.** 4
98c0: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
98d0: 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74  ter found on int
98e0: 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20  erior pages, if 
98f0: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a  there is one..**
9900: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9910: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
9920: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
9930: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
9940: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
9950: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
9960: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
9970: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
9980: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
9990: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
99a0: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23  lIdx[2*(I)]))).#
99b0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50  define findCellP
99c0: 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20 20  astPtr(P,I) \.  
99d0: 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74 20  ((P)->aDataOfst 
99e0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
99f0: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
9a00: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
9a10: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a  x[2*(I)]))).../*
9a20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d 6d  .** This is comm
9a30: 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73 69  on tail processi
9a40: 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72 73  ng for btreePars
9a50: 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a  eCellPtr() and.*
9a60: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
9a70: 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20 74  PtrIndex() for t
9a80: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
9a90: 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66   cell does not f
9aa0: 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f  it entirely.** o
9ab0: 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72 65  n a single B-tre
9ac0: 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65  e page.  Make ne
9ad0: 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
9ae0: 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c 49  nts to the CellI
9af0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
9b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
9b10: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
9b20: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9b30: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9b40: 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65 20  flow(.  MemPage 
9b50: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9b60: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9b70: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9b80: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9ba0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9bb0: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9bc0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9bd0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9be0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9bf0: 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ){.  /* If the p
9c00: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
9c10: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
9c20: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
9c30: 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  , we have.  ** t
9c40: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
9c50: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
9c60: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
9c70: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
9c80: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
9c90: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
9ca0: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
9cb0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
9cc0: 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65 20  used.  ** space 
9cd0: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
9ce0: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
9cf0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
9d00: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a  cal storage.  **
9d10: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
9d20: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
9d30: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72  l..  **.  ** War
9d40: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
9d50: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
9d60: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
9d70: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
9d80: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
9d90: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
9da0: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
9db0: 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d  at..  */.  int m
9dc0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
9dd0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
9de0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
9df0: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  lly */.  int max
9e00: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
9e10: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
9e20: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
9e30: 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c  y */.  int surpl
9e40: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
9e50: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
9e60: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
9e70: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c  orage */..  minL
9e80: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
9e90: 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63  nLocal;.  maxLoc
9ea0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
9eb0: 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20  ocal;.  surplus 
9ec0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49  = minLocal + (pI
9ed0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
9ee0: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
9ef0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9f00: 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  e-4);.  testcase
9f10: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
9f20: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
9f30: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
9f40: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
9f50: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
9f60: 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  cal ){.    pInfo
9f70: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9f80: 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65  surplus;.  }else
9f90: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
9fa0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
9fb0: 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  cal;.  }.  pInfo
9fc0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
9fd0: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
9fe0: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
9ff0: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  al] - pCell);.  
a000: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
a010: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
a020: 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 4;.}../*.** Th
a030: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
a040: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
a050: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
a060: 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65  MemPage.xParseCe
a070: 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  ll().** method..
a080: 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  **.** Parse a ce
a090: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
a0a0: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
a0b0: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
a0c0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65  ure..**.** btree
a0d0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20  ParseCellPtr()  
a0e0: 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65        =>   table
a0f0: 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65   btree leaf node
a100: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
a110: 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  ellNoPayload()  
a120: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
a130: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a   internal nodes.
a140: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
a150: 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e  lPtrIndex()   =>
a160: 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e     index btree n
a170: 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  odes.**.** There
a180: 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70   is also a wrapp
a190: 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65  er function btre
a1a0: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61  eParseCell() tha
a1b0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61  t works for.** a
a1c0: 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73  ll MemPage types
a1d0: 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72 65   and that refere
a1e0: 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79  nces the cell by
a1f0: 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74 68   index rather th
a200: 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72  an.** by pointer
a210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a220: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
a230: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d  trNoPayload(.  M
a240: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
a250: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
a260: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
a270: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
a280: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
a290: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
a2a0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
a2b0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
a2c0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
a2d0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
a2e0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ure */.){.  asse
a2f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a300: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a310: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
a320: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
a330: 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  af==0 );.  asser
a340: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
a350: 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oad );.  assert(
a360: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
a370: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
a380: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a390: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a3a0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
a3b0: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
a3c0: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
a3d0: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
a3e0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
a3f0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
a400: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
a410: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
a420: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
a430: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
a440: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
a450: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
a460: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
a470: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
a480: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
a490: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
a4a0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
a4b0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
a4c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
a4d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
a4e0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
a4f0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
a500: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
a510: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
a520: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a540: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
a550: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
a560: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
a570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a580: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
a590: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
a5a0: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
a5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
a5c0: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
a5d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
a5e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a5f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a600: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a610: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
a620: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
a630: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
a640: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
a650: 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79   || pPage->noPay
a660: 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74  load );.  assert
a670: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
a680: 61 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ad==0 );.  asser
a690: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
a6a0: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
a6b0: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
a6c0: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
a6d0: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
a6e0: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
a6f0: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
a700: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
a710: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
a720: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
a730: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
a740: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
a750: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
a760: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
a770: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
a780: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
a790: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
a7a0: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
a7b0: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
a7c0: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
a7d0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
a7e0: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
a7f0: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
a800: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
a810: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
a820: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
a830: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
a840: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
a850: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
a860: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
a870: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
a880: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
a890: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
a8a0: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
a8b0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
a8c0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
a8d0: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
a8e0: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
a8f0: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
a900: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
a910: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
a920: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
a930: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
a940: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
a950: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
a960: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
a970: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
a980: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
a990: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
a9a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
a9b0: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
a9c0: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
a9d0: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
a9e0: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
a9f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
aa00: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
aa10: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
aa20: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
aa30: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
aa40: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
aa50: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
aa60: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
aa70: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
aa80: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
aa90: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
aaa0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
aab0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
aac0: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
aad0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
aae0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
aaf0: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
ab00: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
ab10: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
ab20: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
ab30: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
ab40: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
ab50: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
ab60: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
ab70: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
ab80: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
ab90: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
aba0: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
abb0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
abc0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
abd0: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
abe0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
abf0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c  rflow = 0;.  }el
ac00: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
ac10: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
ac20: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
ac30: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
ac40: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
ac50: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
ac60: 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65  llPtrIndex(.  Me
ac70: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
ac80: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
ac90: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
aca0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
acb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
acc0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
acd0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
ace0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
acf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
ad00: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
ad10: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
ad20: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
ad30: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
ad40: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
ad50: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
ad60: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
ad70: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
ad80: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
ad90: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
ada0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
adb0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
adc0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
add0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
ade0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
adf0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
ae00: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
ae10: 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  f==0 );.  assert
ae20: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
ae30: 61 64 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  ad==0 );.  pIter
ae40: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
ae50: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
ae60: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
ae70: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
ae80: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
ae90: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
aea0: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
aeb0: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
aec0: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
aed0: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
aee0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
aef0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
af00: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
af10: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
af20: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
af30: 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ++;.  pInfo->nKe
af40: 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  y = nPayload;.  
af50: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
af60: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
af70: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
af80: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
af90: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
afa0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
afb0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
afc0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
afd0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
afe0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
aff0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
b000: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
b010: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
b020: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
b030: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
b040: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
b050: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
b060: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
b070: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
b080: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
b090: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
b0a0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b0b0: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
b0c0: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
b0d0: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
b0e0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
b0f0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
b100: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
b110: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
b120: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
b130: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
b140: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
b150: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
b160: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
b170: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
b180: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
b190: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
b1a0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
b1b0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
b1c0: 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   iCell,         
b1d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
b1e0: 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63   index.  First c
b1f0: 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65  ell is 0 */.  Ce
b200: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
b210: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
b220: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
b230: 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78  */.){.  pPage->x
b240: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
b250: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
b260: 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b   iCell), pInfo);
b270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
b280: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
b290: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   are implementat
b2a0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ions of the MemP
b2b0: 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a  age.xCellSize.**
b2c0: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43   method..**.** C
b2d0: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
b2e0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b2f0: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
b300: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
b310: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
b320: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
b330: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
b340: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
b350: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
b360: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
b370: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
b380: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
b390: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
b3a0: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
b3b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  cell pointer..**
b3c0: 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  .** cellSizePtrN
b3d0: 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e  oPayload()    =>
b3e0: 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61     table interna
b3f0: 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53  l nodes.** cellS
b400: 69 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20  izePtr()        
b410: 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e       =>   all in
b420: 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c  dex nodes & tabl
b430: 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a  e leaf nodes.*/.
b440: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
b450: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
b460: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
b470: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
b480: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
b490: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
b4a0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
b4b0: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
b4c0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b4f0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b500: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
b510: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
b540: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
b550: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b560: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
b570: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
b580: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
b590: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
b5a0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
b5b0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
b5c0: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
b5d0: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
b5e0: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
b5f0: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
b600: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
b610: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
b620: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
b630: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
b640: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
b650: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
b660: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
b670: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
b680: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70  o debuginfo;.  p
b690: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
b6a0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
b6b0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
b6c0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
b6d0: 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d  age->noPayload==
b6e0: 30 20 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20 2a  0 );.  nSize = *
b6f0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69  pIter;.  if( nSi
b700: 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ze>=0x80 ){.    
b710: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
b720: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30  ;.    nSize &= 0
b730: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
b740: 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a     nSize = (nSiz
b750: 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  e<<7) | (*++pIte
b760: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
b770: 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e  while( *(pIter)>
b780: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
b790: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
b7a0: 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67  er++;.  if( pPag
b7b0: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
b7c0: 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f   /* pIter now po
b7d0: 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62  ints at the 64-b
b7e0: 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76  it integer key v
b7f0: 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65  alue, a variable
b800: 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20   length .    ** 
b810: 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c  integer. The fol
b820: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76  lowing block mov
b830: 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  es pIter to poin
b840: 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62  t at the first b
b850: 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  yte.    ** past 
b860: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b  the end of the k
b870: 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  ey value. */.   
b880: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
b890: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
b8a0: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
b8b0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
b8c0: 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e   }.  testcase( n
b8d0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
b8e0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
b8f0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
b900: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
b910: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50  .  if( nSize<=pP
b920: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
b930: 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75  .    nSize += (u
b940: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
b950: 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  l);.    if( nSiz
b960: 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b  e<4 ) nSize = 4;
b970: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
b980: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
b990: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
b9a0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
b9b0: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
b9c0: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
b9d0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b9e0: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
b9f0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
ba00: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
ba10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
ba20: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
ba30: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
ba40: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
ba50: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
ba60: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
ba70: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
ba80: 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28  ze += 4 + (u16)(
ba90: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
baa0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53    }.  assert( nS
bab0: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
bac0: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
bad0: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
bae0: 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61  u16)nSize;.}.sta
baf0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
bb00: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d  PtrNoPayload(Mem
bb10: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
bb20: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
bb30: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34  Iter = pCell + 4
bb40: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
bb50: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
bb60: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
bb70: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
bb80: 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72   /* End mark for
bb90: 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69   a varint */..#i
bba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
bbb0: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
bbc0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
bbd0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
bbe0: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
bbf0: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
bc00: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
bc10: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
bc20: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
bc30: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
bc40: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
bc50: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
bc60: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
bc70: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
bc80: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
bc90: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
bca0: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
bcb0: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
bcc0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
bcd0: 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65  buginfo;.  pPage
bce0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
bcf0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
bd00: 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  ginfo);.#else.  
bd10: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
bd20: 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  (pPage);.#endif.
bd30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bd40: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d  ->childPtrSize==
bd50: 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49  4 );.  pEnd = pI
bd60: 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65  ter + 9;.  while
bd70: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
bd80: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
bd90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 62  );.  assert( deb
bda0: 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75  uginfo.nSize==(u
bdb0: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
bdc0: 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  l) || CORRUPT_DB
bdd0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
bde0: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
bdf0: 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  );.}...#ifdef SQ
be00: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
be10: 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20  is variation on 
be20: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73  cellSizePtr() is
be30: 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20   used inside of 
be40: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
be50: 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a  nts.** only. */.
be60: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
be70: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
be80: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
be90: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
bea0: 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
beb0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
bec0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
bed0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
bee0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
bef0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
bf00: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
bf10: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
bf20: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
bf30: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
bf40: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
bf50: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
bf60: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
bf70: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
bf80: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
bf90: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
bfa0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
bfb0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
bfc0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
bfd0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
bfe0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
bff0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
c000: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61  Cell!=0 );.  pPa
c010: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
c020: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
c030: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
c040: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
c050: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
c060: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
c070: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
c080: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
c090: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
c0a0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
c0b0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
c0c0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
c0d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
c0e0: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
c0f0: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
c100: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
c110: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
c120: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
c130: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
c140: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
c150: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
c160: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
c170: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
c180: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
c190: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
c1a0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c1b0: 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45  ..**.** EVIDENCE
c1c0: 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31  -OF: R-44582-601
c1d0: 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72  38 SQLite may fr
c1e0: 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20  om time to time 
c1f0: 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20  reorganize a.** 
c200: 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74  b-tree page so t
c210: 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hat there are no
c220: 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66   freeblocks or f
c230: 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61  ragment bytes, a
c240: 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74  ll.** unused byt
c250: 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  es are contained
c260: 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61   in the unalloca
c270: 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e  ted space region
c280: 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c  , and all.** cel
c290: 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69  ls are packed ti
c2a0: 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64  ghtly at the end
c2b0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
c2c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
c2d0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
c2e0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
c2f0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c310: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
c320: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
c330: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
c340: 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ess of the i-th 
c350: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
c360: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c370: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
c380: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
c390: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
c3c0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
c3d0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
c3e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c3f0: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
c400: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
c410: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
c420: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
c430: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
c440: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
c450: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
c460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c470: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
c480: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
c490: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c4b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
c4c0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
c4d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c4e0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
c4f0: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
c500: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
c510: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
c520: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
c530: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
c540: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c550: 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  *src;        /* 
c560: 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e  Source of conten
c570: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
c580: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
c590: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
c5a0: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
c5b0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
c5c0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
c5d0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
c5e0: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
c5f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c600: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c610: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c620: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c630: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
c640: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c650: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
c660: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
c670: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
c680: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
c690: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
c6a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c6b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
c6c0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
c6d0: 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73  .  temp = 0;.  s
c6e0: 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67  rc = data = pPag
c6f0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
c700: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c710: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
c720: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
c730: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
c740: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
c750: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
c760: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
c770: 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c  r+3]) );.  usabl
c780: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
c790: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
c7a0: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
c7b0: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ize;.  iCellFirs
c7c0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
c7d0: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c   2*nCell;.  iCel
c7e0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
c7f0: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
c800: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
c810: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
c820: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
c830: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
c840: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
c850: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
c860: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
c870: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
c880: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c890: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
c8a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c8b0: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
c8c0: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
c8d0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
c8e0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
c8f0: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
c900: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
c910: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
c920: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
c930: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
c940: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
c950: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
c960: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c970: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c980: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  }.    assert( pc
c990: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20  >=iCellFirst && 
c9a0: 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc<=iCellLast );
c9b0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67  .    size = pPag
c9c0: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
c9d0: 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20  ge, &src[pc]);. 
c9e0: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
c9f0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
ca00: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73  ellFirst || pc+s
ca10: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
ca20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
ca30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ca40: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
ca50: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
ca60: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
ca70: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
ca80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ca90: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
caa0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
cab0: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
cac0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
cad0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
cae0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66  r, cbrk);.    if
caf0: 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  ( temp==0 ){.   
cb00: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20     int x;.      
cb10: 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63  if( cbrk==pc ) c
cb20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74  ontinue;.      t
cb30: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  emp = sqlite3Pag
cb40: 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67  erTempSpace(pPag
cb50: 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  e->pBt->pPager);
cb60: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
cb70: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
cb80: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
cb90: 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b  &temp[x], &data[
cba0: 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20  x], (cbrk+size) 
cbb0: 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20  - x);.      src 
cbc0: 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20  = temp;.    }.  
cbd0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
cbe0: 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20  brk], &src[pc], 
cbf0: 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73  size);.  }.  ass
cc00: 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  ert( cbrk>=iCell
cc10: 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62  First );.  put2b
cc20: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
cc30: 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b  , cbrk);.  data[
cc40: 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+1] = 0;.  da
cc50: 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20  ta[hdr+2] = 0;. 
cc60: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
cc70: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
cc80: 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c  [iCellFirst], 0,
cc90: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
cca0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
ccb0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
ccc0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
ccd0: 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62  age) );.  if( cb
cce0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70  rk-iCellFirst!=p
ccf0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
cd00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cd10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
cd20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
cd30: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
cd40: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d  Search the free-
cd50: 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67  list on page pPg
cd60: 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74   for space to st
cd70: 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65  ore a cell nByte
cd80: 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a   bytes in.** siz
cd90: 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65  e. If one can be
cda0: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61   found, return a
cdb0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cdc0: 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65  space and remove
cdd0: 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   it.** from the 
cde0: 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
cdf0: 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
ce00: 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75  space can be fou
ce10: 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  nd on the free-l
ce20: 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ist, return NULL
ce30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
ce40: 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74  ction may detect
ce50: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68   corruption with
ce60: 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72  in pPg.  If corr
ce70: 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74  uption is.** det
ce80: 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20  ected then *pRc 
ce90: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
cea0: 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c  _CORRUPT and NUL
ceb0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
cec0: 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68  *.** Slots on th
ced0: 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74  e free list that
cee0: 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61   are between 1 a
cef0: 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65  nd 3 bytes large
cf00: 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20  r than nByte.** 
cf10: 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20  will be ignored 
cf20: 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78  if adding the ex
cf30: 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65  tra space to the
cf40: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
cf50: 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74  ount.** causes t
cf60: 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  he fragmentation
cf70: 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64   count to exceed
cf80: 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75   60..*/.static u
cf90: 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28  8 *pageFindSlot(
cfa0: 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  MemPage *pPg, in
cfb0: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52  t nByte, int *pR
cfc0: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  c){.  const int 
cfd0: 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66  hdr = pPg->hdrOf
cfe0: 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  fset;.  u8 * con
cff0: 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
d000: 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64  aData;.  int iAd
d010: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
d020: 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
d030: 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29  e(&aData[iAddr])
d040: 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74  ;.  int x;.  int
d050: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
d060: 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
d070: 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ze;..  assert( p
d080: 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  c>0 );.  do{.   
d090: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
d0a0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d0b0: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
d0c0: 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  /.    /* EVIDENC
d0d0: 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39  E-OF: R-06866-39
d0e0: 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61  125 Freeblocks a
d0f0: 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63  re always connec
d100: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a  ted in order of.
d110: 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e      ** increasin
d120: 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20  g offset. */.   
d130: 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69   if( pc>usableSi
d140: 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72  ze-4 || pc<iAddr
d150: 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  +4 ){.      *pRc
d160: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
d170: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
d180: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
d190: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
d1a0: 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20  : R-22710-53328 
d1b0: 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f  The third and fo
d1c0: 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61  urth bytes of ea
d1d0: 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  ch.    ** freebl
d1e0: 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65  ock form a big-e
d1f0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
d200: 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20  ich is the size 
d210: 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  of the freeblock
d220: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73  .    ** in bytes
d230: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
d240: 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a  4-byte header. *
d250: 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74  /.    size = get
d260: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
d270: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20  2]);.    if( (x 
d280: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e  = size - nByte)>
d290: 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
d2a0: 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20  case( x==4 );.  
d2b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
d2c0: 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =3 );.      if( 
d2d0: 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66  pc < pPg->cellOf
d2e0: 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c  fset+2*pPg->nCel
d2f0: 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75  l || size+pc > u
d300: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
d310: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
d320: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d330: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d340: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
d350: 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( x<4 ){.      
d360: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
d370: 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20  : R-11498-58022 
d380: 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
d390: 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
d3a0: 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20  e total.        
d3b0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
d3c0: 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20  es in fragments 
d3d0: 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36  may not exceed 6
d3e0: 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  0. */.        if
d3f0: 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35  ( aData[hdr+7]>5
d400: 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  7 ) return 0;.. 
d410: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
d420: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
d430: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
d440: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
d450: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  of.        ** fr
d460: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
d470: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
d480: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
d490: 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c  y(&aData[iAddr],
d4a0: 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b   &aData[pc], 2);
d4b0: 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68  .        aData[h
d4c0: 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a  dr+7] += (u8)x;.
d4d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d4e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74       /* The slot
d4f0: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
d500: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
d510: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
d520: 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a  count.         *
d530: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
d540: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
d550: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
d560: 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74  .        put2byt
d570: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20  e(&aData[pc+2], 
d580: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
d590: 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b    return &aData[
d5a0: 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20  pc + x];.    }. 
d5b0: 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20     iAddr = pc;. 
d5c0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
d5d0: 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20  (&aData[pc]);.  
d5e0: 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20  }while( pc );.. 
d5f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
d600: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
d610: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
d620: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
d630: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
d640: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
d650: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57  irst argument. W
d660: 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20  rite into *pIdx 
d670: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
d680: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a  Page->aData[].**
d690: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
d6a0: 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  te of allocated 
d6b0: 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69  space. Return ei
d6c0: 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  ther SQLITE_OK o
d6d0: 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  r.** an error co
d6e0: 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49  de (usually SQLI
d6f0: 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
d700: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
d710: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
d720: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
d730: 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  t space to make 
d740: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
d750: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
d760: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
d770: 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64  efragment in ord
d780: 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61  er to bring.** a
d790: 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67  ll the space tog
d7a0: 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20  ether, however. 
d7b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
d7c0: 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a  ll avoid using.*
d7d0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  * the first two 
d7e0: 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63  bytes past the c
d7f0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61  ell pointer area
d800: 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c   since presumabl
d810: 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61  y this.** alloca
d820: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61  tion is being ma
d830: 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  de in order to i
d840: 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
d850: 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  , so we will.** 
d860: 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64  also end up need
d870: 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70  ing a new cell p
d880: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
d890: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
d8a0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
d8b0: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  ge, int nByte, i
d8c0: 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e  nt *pIdx){.  con
d8d0: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
d8e0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
d8f0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
d900: 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66   of pPage->hdrOf
d910: 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63  fset */.  u8 * c
d920: 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
d930: 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f  e->aData;      /
d940: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
d950: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
d960: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d990: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
d9a0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
d9b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d9c0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d9d0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
d9e0: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
d9f0: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
da00: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
da10: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
da20: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
da30: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
da40: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
da50: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
da60: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
da70: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
da80: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
da90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
daa0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
dab0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
dac0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
dad0: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
dae0: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
daf0: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
db00: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
db10: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
db20: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
db30: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
db40: 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29  t( nByte < (int)
db50: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
db60: 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20  bleSize-8) );.. 
db70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
db80: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
db90: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
dba0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
dbb0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
dbc0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
dbd0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
dbe0: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
dbf0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
dc00: 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66  R-29356-02391 If
dc10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
dc20: 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20  es a 65536-byte 
dc30: 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61  page size.  ** a
dc40: 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20  nd the reserved 
dc50: 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74  space is zero (t
dc60: 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66  he usual value f
dc70: 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63  or reserved spac
dc80: 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e).  ** then the
dc90: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
dca0: 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79  fset of an empty
dcb0: 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62   page wants to b
dcc0: 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f  e 65536..  ** Ho
dcd0: 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65  wever, that inte
dce0: 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ger is too large
dcf0: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e   to be stored in
dd00: 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   a 2-byte unsign
dd10: 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  ed.  ** integer,
dd20: 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30   so a value of 0
dd30: 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20   is used in its 
dd40: 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20  place. */.  top 
dd50: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
dd60: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65  [hdr+5]);.  asse
dd70: 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50  rt( top<=(int)pP
dd80: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
dd90: 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65  Size ); /* Preve
dda0: 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74  nt by getAndInit
ddb0: 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20  Page() */.  if( 
ddc0: 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69  gap>top ){.    i
ddd0: 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61  f( top==0 && pPa
dde0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ddf0: 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20  ize==65536 ){.  
de00: 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b      top = 65536;
de10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
de20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
de30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
de40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
de50: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
de60: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67   space between g
de70: 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f  ap and top for o
de80: 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69  ne more cell poi
de90: 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20  nter.  ** array 
dea0: 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e  entry offset, an
deb0: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
dec0: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
ded0: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
dee0: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
def0: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
df00: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
df10: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
df20: 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20  request..  */.  
df30: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d  testcase( gap+2=
df40: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
df50: 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29  se( gap+1==top )
df60: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
df70: 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  p==top );.  if( 
df80: 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20  (data[hdr+2] || 
df90: 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20  data[hdr+1]) && 
dfa0: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
dfb0: 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70    u8 *pSpace = p
dfc0: 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67  ageFindSlot(pPag
dfd0: 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a  e, nByte, &rc);.
dfe0: 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29      if( pSpace )
dff0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
e000: 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20  pSpace>=data && 
e010: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c  (pSpace - data)<
e020: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a  65536 );.      *
e030: 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70  pIdx = (int)(pSp
e040: 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20  ace - data);.   
e050: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e060: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
e070: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
e080: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e090: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65    }..  /* The re
e0a0: 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20  quest could not 
e0b0: 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69  be fulfilled usi
e0c0: 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c  ng a freelist sl
e0d0: 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20  ot.  Check.  ** 
e0e0: 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67  to see if defrag
e0f0: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63  mentation is nec
e100: 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74  essary..  */.  t
e110: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e  estcase( gap+2+n
e120: 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69  Byte==top );.  i
e130: 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74  f( gap+2+nByte>t
e140: 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  op ){.    assert
e150: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
e160: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
e170: 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  ;.    rc = defra
e180: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
e190: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
e1a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
e1b0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
e1c0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
e1d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
e1e0: 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  ap+nByte<=top );
e1f0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
e200: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
e210: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
e220: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
e230: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
e240: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
e250: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
e260: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
e270: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
e280: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
e290: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
e2a0: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
e2b0: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
e2c0: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
e2d0: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
e2e0: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
e2f0: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
e300: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
e310: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
e320: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
e330: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
e340: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
e350: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
e360: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e370: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
e380: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
e390: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
e3a0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
e3b0: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
e3c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e3d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
e3e0: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
e3f0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
e400: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
e410: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
e420: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
e430: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
e440: 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74  ge->aData[iStart
e450: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
e460: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
e470: 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  s iSize bytes..*
e480: 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72  *.** Adjacent fr
e490: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61  eeblocks are coa
e4a0: 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  lesced..**.** No
e4b0: 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  te that even tho
e4c0: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
e4d0: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
e4e0: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
e4f0: 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72  age(),.** that r
e500: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
e510: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62  detect overlap b
e520: 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20  etween cells or 
e530: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72  freeblocks.  Nor
e540: 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65  .** does it dete
e550: 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  ct cells or free
e560: 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72  blocks that encr
e570: 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65  ouch into the re
e580: 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20  served bytes.** 
e590: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
e5a0: 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61  e page.  So do a
e5b0: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70  dditional corrup
e5c0: 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69  tion checks insi
e5d0: 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  de this.** routi
e5e0: 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ne and return SQ
e5f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
e600: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65  any problems are
e610: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
e620: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
e630: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
e640: 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20  u16 iStart, u16 
e650: 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50  iSize){.  u16 iP
e660: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74  /* Address of pt
e690: 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c  r to next freebl
e6a0: 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72  ock */.  u16 iFr
e6b0: 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20  eeBlk;          
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6d0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
e6e0: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
e6f0: 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
e720: 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20  ge header size. 
e730: 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75   0 or 100 */.  u
e740: 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20  8 nFrag = 0;    
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f       /* Reductio
e770: 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69  n in fragmentati
e780: 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69  on */.  u16 iOri
e790: 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20  gSize = iSize;  
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e7b0: 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
e7c0: 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33  of iSize */.  u3
e7d0: 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d  2 iLast = pPage-
e7e0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
e7f0: 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70  -4; /* Largest p
e800: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
e810: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33  k offset */.  u3
e820: 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20  2 iEnd = iStart 
e830: 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  + iSize;        
e840: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
e850: 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72  e past the iStar
e860: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e  t buffer */.  un
e870: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
e880: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
e890: 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74  ;   /* Page cont
e8a0: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
e8b0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
e8c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e8d0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
e8e0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
e8f0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
e900: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
e910: 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68  iStart>=pPage->h
e920: 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
e930: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
e940: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
e950: 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c  UPT_DB || iEnd <
e960: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
e970: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
e980: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e990: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
e9a0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e9b0: 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d   assert( iSize>=
e9c0: 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  4 );   /* Minimu
e9d0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
e9e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
e9f0: 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a  tart<=iLast );..
ea00: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
ea10: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
ea20: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
ea30: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
ea40: 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  lete.  ** option
ea50: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
ea60: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
ea70: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
ea80: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
ea90: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
eaa0: 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53  a[iStart], 0, iS
eab0: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
eac0: 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65  The list of free
ead0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
eae0: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
eaf0: 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20  r.  Find the .  
eb00: 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c  ** spot on the l
eb10: 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74  ist where iStart
eb20: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
eb30: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20  ted..  */.  hdr 
eb40: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
eb50: 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72  et;.  iPtr = hdr
eb60: 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61   + 1;.  if( data
eb70: 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64  [iPtr+1]==0 && d
eb80: 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a  ata[iPtr]==0 ){.
eb90: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30      iFreeBlk = 0
eba0: 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66  ;  /* Shortcut f
ebb0: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
ebc0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
ebd0: 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73   empty */.  }els
ebe0: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69  e{.    while( (i
ebf0: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
ec00: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29  te(&data[iPtr]))
ec10: 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69  >0 && iFreeBlk<i
ec20: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
ec30: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
ec40: 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  +4 ) return SQLI
ec50: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ec60: 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46  .      iPtr = iF
ec70: 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20  reeBlk;.    }.  
ec80: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69    if( iFreeBlk>i
ec90: 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  Last ) return SQ
eca0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
ecb0: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  T;.    assert( i
ecc0: 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20  FreeBlk>iPtr || 
ecd0: 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20  iFreeBlk==0 );. 
ece0: 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73   .    /* At this
ecf0: 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20   point:.    **  
ed00: 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69    iFreeBlk:   Fi
ed10: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66  rst freeblock af
ed20: 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a  ter iStart, or z
ed30: 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20  ero if none.    
ed40: 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20  **    iPtr:     
ed50: 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66    The address of
ed60: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46   a pointer to iF
ed70: 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20  reeBlk.    **.  
ed80: 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
ed90: 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68  e if iFreeBlk sh
eda0: 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65  ould be coalesce
edb0: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
edc0: 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f  f iStart..    */
edd0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
ede0: 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72  k && iEnd+3>=iFr
edf0: 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e  eeBlk ){.      n
ee00: 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20  Frag = iFreeBlk 
ee10: 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66  - iEnd;.      if
ee20: 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20  ( iEnd>iFreeBlk 
ee30: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ee40: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ee50: 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65      iEnd = iFree
ee60: 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26  Blk + get2byte(&
ee70: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d  data[iFreeBlk+2]
ee80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  );.      if( iEn
ee90: 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  d > pPage->pBt->
eea0: 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74  usableSize ) ret
eeb0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
eec0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
eed0: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53  Size = iEnd - iS
eee0: 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65  tart;.      iFre
eef0: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
ef00: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29  &data[iFreeBlk])
ef10: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
ef20: 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f  * If iPtr is ano
ef30: 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28  ther freeblock (
ef40: 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72  that is, if iPtr
ef50: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65   is not the free
ef60: 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  list.    ** poin
ef70: 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20  ter in the page 
ef80: 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65  header) then che
ef90: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74  ck to see if iSt
efa0: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20  art should be.  
efb0: 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f    ** coalesced o
efc0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
efd0: 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  Ptr..    */.    
efe0: 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29  if( iPtr>hdr+1 )
eff0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72  {.      int iPtr
f000: 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74  End = iPtr + get
f010: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
f020: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
f030: 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72  iPtrEnd+3>=iStar
f040: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
f050: 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20   iPtrEnd>iStart 
f060: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f070: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
f080: 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69        nFrag += i
f090: 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b  Start - iPtrEnd;
f0a0: 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d  .        iSize =
f0b0: 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20   iEnd - iPtr;.  
f0c0: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
f0d0: 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Ptr;.      }.   
f0e0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67   }.    if( nFrag
f0f0: 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72  >data[hdr+7] ) r
f100: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f110: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64  RUPT_BKPT;.    d
f120: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
f130: 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  rag;.  }.  if( i
f140: 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28  Start==get2byte(
f150: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b  &data[hdr+5]) ){
f160: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
f170: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20  freeblock is at 
f180: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
f190: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
f1a0: 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73  t area,.    ** s
f1b0: 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68  o just extend th
f1c0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
f1d0: 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20  rea rather than 
f1e0: 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20  create another. 
f1f0: 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65     ** freelist e
f200: 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  ntry */.    if( 
f210: 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65  iPtr!=hdr+1 ) re
f220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
f230: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75  UPT_BKPT;.    pu
f240: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
f250: 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  +1], iFreeBlk);.
f260: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
f270: 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29  ta[hdr+5], iEnd)
f280: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
f290: 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
f2a0: 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20   freeblock into 
f2b0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
f2c0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
f2d0: 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74  ta[iPtr], iStart
f2e0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
f2f0: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69  &data[iStart], i
f300: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
f310: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
f320: 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
f330: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
f340: 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b  ee += iOrigSize;
f350: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f360: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
f370: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
f380: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
f390: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
f3a0: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
f3b0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
f3c0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
f3d0: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
f3e0: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
f3f0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
f400: 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
f410: 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
f420: 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
f430: 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
f440: 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
f450: 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
f460: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
f470: 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
f480: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
f490: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
f4a0: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
f4b0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
f4c0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
f4d0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
f4e0: 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
f4f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
f500: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
f510: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
f520: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
f530: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
f540: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
f550: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
f560: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
f570: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
f580: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
f590: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
f5a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f5b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
f5c0: 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
f5d0: 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
f5e0: 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
f5f0: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
f600: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
f610: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
f620: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
f630: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
f640: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65  e->leaf;.  pPage
f650: 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
f660: 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74  llSizePtr;.  pBt
f670: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
f680: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
f690: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
f6a0: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
f6b0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f6c0: 3a 20 52 2d 30 33 36 34 30 2d 31 33 34 31 35 20  : R-03640-13415 
f6d0: 41 20 76 61 6c 75 65 20 6f 66 20 35 20 6d 65 61  A value of 5 mea
f6e0: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
f6f0: 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a  n interior.    *
f700: 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  * table b-tree p
f710: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
f720: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
f730: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35  A|PTF_INTKEY)==5
f740: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
f750: 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31 2d  NCE-OF: R-20501-
f760: 36 31 37 39 36 20 41 20 76 61 6c 75 65 20 6f 66  61796 A value of
f770: 20 31 33 20 6d 65 61 6e 73 20 74 68 65 20 70 61   13 means the pa
f780: 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20  ge is a leaf.   
f790: 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65   ** table b-tree
f7a0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f7b0: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
f7c0: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
f7d0: 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
f7e0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f7f0: 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
f800: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
f810: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f820: 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
f830: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
f840: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
f850: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
f860: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
f870: 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  tr;.    }else{. 
f880: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
f890: 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
f8a0: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
f8b0: 61 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  ad = 1;.      pP
f8c0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
f8d0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
f8e0: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
f8f0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
f900: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
f910: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
f920: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
f930: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
f940: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
f950: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f960: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
f970: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
f980: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
f990: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f9a0: 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33 39  -OF: R-27225-539
f9b0: 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  36 A value of 2 
f9c0: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
f9d0: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
f9e0: 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65    ** index b-tre
f9f0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
fa00: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
fa10: 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20  DATA)==2 );.    
fa20: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
fa30: 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41 20  R-16571-11615 A 
fa40: 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61 6e  value of 10 mean
fa50: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20  s the page is a 
fa60: 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65  leaf.    ** inde
fa70: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
fa80: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
fa90: 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f  TF_ZERODATA|PTF_
faa0: 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20  LEAF)==10 );.   
fab0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
fac0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   0;.    pPage->i
fad0: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
fae0: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
faf0: 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  oad = 0;.    pPa
fb00: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
fb10: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
fb20: 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61  trIndex;.    pPa
fb30: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
fb40: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
fb50: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
fb60: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
fb70: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
fb80: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
fb90: 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e  R-47608-56469 An
fba0: 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f  y other value fo
fbb0: 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  r the b-tree pag
fbc0: 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a  e type is.    **
fbd0: 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
fbe0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fbf0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
fc00: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
fc10: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
fc20: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
fc30: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
fc40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fc50: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
fc60: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
fc70: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
fc80: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
fc90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
fca0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
fcb0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
fcc0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
fcd0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
fce0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
fcf0: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
fd00: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
fd10: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
fd20: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
fd30: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
fd40: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
fd50: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
fd60: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
fd70: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
fd80: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
fd90: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
fda0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
fdb0: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
fdc0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
fdd0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
fde0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
fdf0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
fe00: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
fe10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
fe20: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
fe30: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
fe40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
fe50: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
fe60: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
fe70: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
fe80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
fe90: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
fea0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
feb0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
fec0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
fed0: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
fee0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
fef0: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
ff00: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
ff10: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ff30: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
ff40: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
ff50: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
ff60: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
ff70: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
ff80: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
ff90: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
ffa0: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
ffb0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
ffc0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
ffd0: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
ffe0: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
fff0: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
10000 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69  ructure */.    i
10010 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
10020 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
10030 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
10040 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
10050 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
10060 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
10070 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
10080 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
10090 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  inter */.    int
100a0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
100b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
100c0 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
100d0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
100e0 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
100f0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
10100 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10110 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
10120 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
10130 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
10140 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
10150 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
10160 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
10170 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
10180 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
10190 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
101a0 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
101b0 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
101c0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
101d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
101e0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
101f0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
10200 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38  -OF: R-28594-028
10210 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20  90 The one-byte 
10220 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30  flag at offset 0
10230 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20 20   indicating.    
10240 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  ** the b-tree pa
10250 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20  ge type. */.    
10260 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
10270 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
10280 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
10290 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
102a0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
102b0 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
102c0 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
102d0 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50  =65536 );.    pP
102e0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
102f0 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
10300 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50  ize - 1);.    pP
10310 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
10320 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
10330 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
10340 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
10350 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
10360 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
10370 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c   8 + pPage->chil
10380 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 50  dPtrSize;.    pP
10390 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
103a0 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
103b0 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43  ];.    pPage->aC
103c0 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63  ellIdx = &data[c
103d0 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  ellOffset];.    
103e0 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
103f0 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
10400 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
10410 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
10420 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35  F: R-58015-48175
10430 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
10440 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
10450 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20  5 designates.   
10460 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
10470 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10480 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
10490 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
104a0 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  teger is.    ** 
104b0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36  interpreted as 6
104c0 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70  5536. */.    top
104d0 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
104e0 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
104f0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
10500 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32  E-OF: R-37002-32
10510 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65  774 The two-byte
10520 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
10530 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20  et 3 gives the. 
10540 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
10550 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
10560 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d  e. */.    pPage-
10570 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
10580 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
10590 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
105a0 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
105b0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
105c0 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
105d0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
105e0 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
105f0 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
10600 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10610 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10620 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
10630 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
10640 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
10650 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
10660 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39  -OF: R-24089-579
10670 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e  79 If a page con
10680 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28  tains no cells (
10690 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20  which is only.  
106a0 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f    ** possible fo
106b0 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  r a root page of
106c0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
106d0 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20  ntains no rows) 
106e0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
106f0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
10700 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
10710 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
10720 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
10730 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20  he.    ** bytes 
10740 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
10750 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
10760 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
10770 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53   || top==usableS
10780 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
10790 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d  B );..    /* A m
107a0 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
107b0 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
107c0 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61  se us to read pa
107d0 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
107e0 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
107f0 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
10800 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
10810 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
10820 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
10830 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
10840 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
10850 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
10860 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
10870 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
10880 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
10890 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
108a0 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
108b0 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
108c0 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
108d0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
108e0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
108f0 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
10900 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66  Size - 4;.    if
10910 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
10920 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
10930 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e  zeCk ){.      in
10940 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10950 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
10960 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
10970 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e  rray */.      in
10980 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
10990 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
109a0 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  l */..      if( 
109b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
109c0 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
109d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
109e0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
109f0 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65  .        pc = ge
10a00 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
10a10 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
10a20 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
10a30 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
10a40 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
10a50 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
10a60 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
10a70 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
10a80 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
10a90 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10ab0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
10ac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10ad0 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43    sz = pPage->xC
10ae0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
10af0 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
10b00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
10b10 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
10b20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
10b30 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
10b40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
10b50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10b60 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
10b70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10b80 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
10b90 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
10ba0 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20      }  ..    /* 
10bb0 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
10bc0 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
10bd0 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  the page.    ** 
10be0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
10bf0 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
10c00 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10c10 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
10c20 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61  s the.    ** sta
10c30 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  rt of the first 
10c40 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65  freeblock on the
10c50 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72   page, or is zer
10c60 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  o if there are n
10c70 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  o.    ** freeblo
10c80 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d  cks. */.    pc =
10c90 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10ca0 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
10cb0 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
10cc0 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
10cd0 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
10ce0 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
10cf0 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  ce */.    while(
10d00 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
10d10 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
10d20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
10d30 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
10d40 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10d50 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10d60 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20  : R-55530-52930 
10d70 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
10d80 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
10d90 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  ere will.       
10da0 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
10db0 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
10dc0 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
10dd0 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
10de0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
10df0 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62 6c  * Or, the freebl
10e00 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 65  ock is off the e
10e10 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20  nd of the page. 
10e20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10e40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
10e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
10e60 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
10e70 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
10e80 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
10e90 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
10ea0 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26     if( (next>0 &
10eb0 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
10ec0 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  3) || pc+size>us
10ed0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
10ee0 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
10ef0 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
10f00 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41  cending order. A
10f10 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  nd the last byte
10f20 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
10f30 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
10f40 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
10f50 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
10f60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10f70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
10f80 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
10f90 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
10fa0 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
10fb0 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
10fc0 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
10fd0 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
10fe0 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
10ff0 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
11000 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
11010 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
11020 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
11030 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
11040 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
11050 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
11060 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
11070 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
11080 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
11090 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
110a0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
110b0 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
110c0 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
110d0 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
110e0 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
110f0 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
11100 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
11110 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
11120 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
11130 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
11140 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
11150 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
11160 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
11170 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
11180 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
11190 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
111a0 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
111b0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
111c0 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
111d0 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
111e0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
111f0 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
11200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11210 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
11220 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
11230 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
11240 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
11250 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
11260 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
11270 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
11280 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
11290 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
112a0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
112b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
112c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
112d0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
112e0 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
112f0 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
11300 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
11310 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
11320 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
11330 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
11340 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
11350 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
11360 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
11370 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
11380 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
11390 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
113a0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
113b0 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
113c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
113d0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
113e0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
113f0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
11400 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11410 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11420 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
11430 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
11440 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
11450 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
11460 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
11470 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
11480 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
11490 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
114a0 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
114b0 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
114c0 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
114d0 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
114e0 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
114f0 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
11500 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
11510 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
11520 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
11530 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
11540 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
11550 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
11560 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
11570 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
11580 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
11590 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
115a0 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
115b0 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
115c0 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
115d0 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
115e0 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  rst];.  pPage->a
115f0 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61  DataOfst = &data
11600 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
11610 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
11620 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
11630 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
11640 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
11650 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
11660 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
11670 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
11680 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
11690 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43   1);.  pPage->nC
116a0 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
116b0 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
116c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
116d0 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
116e0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
116f0 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
11700 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
11710 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
11720 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
11730 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
11740 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
11750 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
11760 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
11770 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
11780 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
11790 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
117a0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
117b0 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
117c0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
117d0 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
117e0 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
117f0 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
11800 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
11810 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
11820 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
11830 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31  et = pgno==1 ? 1
11840 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  00 : 0;.  return
11850 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a   pPage; .}../*.*
11860 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
11870 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
11880 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
11890 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
118a0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
118b0 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
118c0 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72  .  See also: btr
118d0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
118e0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
118f0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11900 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ENT flag is set,
11910 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
11920 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a  e do not care.**
11930 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
11940 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
11950 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
11960 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
11970 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
11980 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
11990 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
119a0 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
119b0 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
119c0 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
119d0 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
119e0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
119f0 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
11a00 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
11a10 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
11a20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
11a30 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
11a40 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
11a50 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
11a60 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
11a70 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50  ic int btreeGetP
11a80 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11a90 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
11aa0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
11ab0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
11ac0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11ad0 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
11ae0 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
11af0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
11b00 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
11b10 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
11b20 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
11b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
11b40 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
11b50 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52  T or PAGER_GET_R
11b60 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20  EADONLY */.){.  
11b70 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
11b80 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
11b90 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
11ba0 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
11bb0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20  ET_NOCONTENT || 
11bc0 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
11bd0 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61  _READONLY );.  a
11be0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11bf0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
11c00 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
11c10 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
11c20 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
11c30 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
11c40 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73  )&pDbPage, flags
11c50 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
11c60 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
11c70 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
11c80 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
11c90 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
11ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11cb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
11cc0 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
11cd0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
11ce0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
11cf0 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
11d00 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
11d10 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
11d20 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
11d30 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
11d40 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
11d50 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
11d60 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
11d70 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
11d80 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
11d90 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
11da0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
11db0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
11dc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11dd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11de0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
11df0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
11e00 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
11e10 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
11e20 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
11e30 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
11e40 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
11e50 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
11e60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
11e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11e80 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
11e90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11ea0 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
11eb0 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
11ec0 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
11ed0 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
11ee0 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
11ef0 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63   Pgno btreePagec
11f00 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
11f10 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
11f20 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20  t->nPage;.}.u32 
11f30 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
11f40 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Page(Btree *p){.
11f50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11f60 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
11f70 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
11f80 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65   ((p->pBt->nPage
11f90 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20  )&0x8000000)==0 
11fa0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  );.  return btre
11fb0 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
11fc0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
11fd0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
11fe0 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
11ff0 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  alize it..**.** 
12000 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20  If pCur!=0 then 
12010 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
12020 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72  g fetched as par
12030 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69  t of a moveToChi
12040 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44  ld().** call.  D
12050 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  o additional san
12060 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
12070 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
12080 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66   case..** And if
12090 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73   the fetch fails
120a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
120b0 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43  ust decrement pC
120c0 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  ur->iPage..**.**
120d0 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74   The page is fet
120e0 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69  ched as read-wri
120f0 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69  te unless pCur i
12100 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
12110 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s.** a read-only
12120 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
12130 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12140 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  s, then *ppPage 
12150 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
12160 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
12170 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
12180 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
12190 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
121a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
121b0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
121c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121e0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
121f0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
12200 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
12210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12220 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
12230 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
12240 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
12250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
12260 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
12270 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
12280 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63  /* Cursor to rec
122b0 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f  eive the page, o
122c0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
122d0 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20  bReadOnly       
122e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
122f0 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
12300 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  nly page */.){. 
12310 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
12320 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
12330 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12340 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
12350 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
12360 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50  ( pCur==0 || ppP
12370 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61  age==&pCur->apPa
12380 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
12390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
123a0 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c  r==0 || bReadOnl
123b0 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65  y==pCur->curPage
123c0 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65  rFlags );.  asse
123d0 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
123e0 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
123f0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
12400 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
12410 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12420 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12430 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
12440 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
12450 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
12460 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
12470 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
12480 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
12490 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29  Page, bReadOnly)
124a0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
124b0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
124c0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
124d0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
124e0 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
124f0 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
12500 70 42 74 29 3b 0a 20 20 69 66 28 20 28 2a 70 70  pBt);.  if( (*pp
12510 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
12520 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
12530 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
12540 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
12550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12560 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12570 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
12580 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
12590 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  age_error;.    }
125a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 62  .  }..  /* If ob
125b0 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20  taining a child 
125c0 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f  page for a curso
125d0 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69 66  r, we must verif
125e0 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
125f0 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62  is.  ** compatib
12600 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74  le with the root
12610 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20   page. */.  if( 
12620 70 43 75 72 0a 20 20 20 26 26 20 28 28 2a 70 70  pCur.   && ((*pp
12630 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  Page)->nCell<1 |
12640 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74  | (*ppPage)->int
12650 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key!=pCur->curIn
12660 74 4b 65 79 29 0a 20 20 29 7b 0a 20 20 20 20 72  tKey).  ){.    r
12670 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
12680 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c  PT_BKPT;.    rel
12690 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
126a0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  );.    goto getA
126b0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
126c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
126d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e  QLITE_OK;..getAn
126e0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a  dInitPage_error:
126f0 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70 43  .  if( pCur ) pC
12700 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74  ur->iPage--;.  t
12710 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
12720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
12730 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
12740 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
12750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12760 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
12770 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
12780 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
12790 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
127a0 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
127b0 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
127c0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
127d0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
127e0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
127f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12800 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
12810 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
12820 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12830 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
12840 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12850 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
12860 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
12870 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
12880 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12890 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
128a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
128b0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
128c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
128d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
128e0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
128f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
12900 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
12910 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
12920 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
12930 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
12940 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
12950 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73 65   pPage ) release
12960 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
12970 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e);.}../*.** Get
12980 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e   an unused page.
12990 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
129a0 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65  s just like btre
129b0 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20  eGetPage() with 
129c0 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a  the addition:.**
129d0 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20  .**   *  If the 
129e0 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
129f0 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20  in use for some 
12a00 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69  other purpose, i
12a10 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
12a20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e     release it an
12a30 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  d return an SQLI
12a40 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72  TE_CURRUPT error
12a50 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73  ..**   *  Make s
12a60 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66  ure the isInit f
12a70 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a  lag is clear.*/.
12a80 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
12a90 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20  GetUnusedPage(. 
12aa0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
12ab0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
12ac0 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
12ad0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
12ae0 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
12af0 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
12b00 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
12b10 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
12b20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
12b30 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
12b40 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
12b50 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
12b60 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
12b70 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
12b80 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
12b90 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
12ba0 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
12bb0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
12bc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12bd0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
12be0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
12bf0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
12c00 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
12c10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
12c20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
12c30 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
12c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12c50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
12c60 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
12c70 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
12c80 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
12c90 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
12ca0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
12cb0 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
12cc0 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
12cd0 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
12ce0 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
12cf0 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
12d00 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
12d10 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
12d20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
12d30 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
12d40 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
12d50 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
12d60 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
12d70 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12d80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12d90 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
12da0 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
12db0 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
12dc0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
12dd0 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
12de0 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
12df0 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
12e00 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
12e10 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
12e20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
12e30 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
12e40 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
12e50 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
12e60 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
12e70 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
12e80 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
12e90 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
12ea0 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
12eb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12ec0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
12ed0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12ee0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
12ef0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
12f00 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
12f10 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
12f20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
12f30 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
12f40 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
12f50 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
12f60 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
12f70 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
12f80 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
12f90 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
12fa0 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
12fb0 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
12fc0 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
12fd0 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
12fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
12ff0 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
13000 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
13010 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
13020 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
13030 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
13040 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
13050 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
13060 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
13070 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
13080 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
13090 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
130a0 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
130b0 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
130c0 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
130d0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
130e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
130f0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
13100 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
13110 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13120 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
13130 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
13140 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
13150 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
13160 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
13170 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
13180 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13190 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
131a0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
131b0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
131c0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
131d0 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
131e0 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
131f0 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
13200 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
13210 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
13220 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
13230 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
13240 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
13250 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65  * then an epheme
13260 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  ral database is 
13270 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70  created.  The ep
13280 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
13290 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63   might.** be exc
132a0 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f  lusively in memo
132b0 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
132c0 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64  use a disk-based
132d0 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a   memory cache..*
132e0 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  * Either way, th
132f0 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
13300 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74  base will be aut
13310 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
13320 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69  ed .** when sqli
13330 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
13340 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
13350 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
13360 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
13370 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
13380 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
13390 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
133a0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
133b0 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
133c0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
133d0 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65  e "flags" parame
133e0 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
133f0 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74   that might cont
13400 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a  ain bits like.**
13410 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
13420 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45  NAL and/or BTREE
13430 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49  _MEMORY..**.** I
13440 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
13450 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
13460 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
13470 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13480 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
13490 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
134a0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
134b0 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
134c0 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
134d0 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
134e0 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
134f0 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
13500 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
13510 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
13520 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13530 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
13540 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
13550 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
13560 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
13570 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
13580 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
13590 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46  pVfs,      /* VF
135a0 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
135b0 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
135c0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
135d0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
135e0 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
135f0 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
13600 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
13610 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
13620 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
13630 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
13640 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
13650 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
13660 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
13670 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
13680 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
13690 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
136a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
136b0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
136c0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
136d0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
136e0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
136f0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
13700 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
13710 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
13720 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
13730 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
13740 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
13750 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13770 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
13780 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
13790 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
137a0 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
137b0 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
137c0 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
137d0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
137e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
137f0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
13800 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
13810 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
13820 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
13830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
13840 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
13850 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
13860 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
13870 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
13880 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
13890 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
138a0 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ..  /* True if o
138b0 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  pening an epheme
138c0 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64  ral, temporary d
138d0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
138e0 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20  st int isTempDb 
138f0 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  = zFilename==0 |
13900 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
13910 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
13920 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
13930 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
13940 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
13950 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
13960 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
13970 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  ased database.. 
13980 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
13990 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
139a0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
139b0 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  mdb = 0;.#else. 
139c0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
139d0 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20  db = (zFilename 
139e0 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  && strcmp(zFilen
139f0 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
13a00 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
13a10 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
13a20 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69  isTempDb && sqli
13a30 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
13a40 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  db)).           
13a50 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
13a60 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
13a70 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d  E_OPEN_MEMORY)!=
13a80 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
13a90 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
13aa0 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
13ab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13ac0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13ad0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
13ae0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
13af0 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
13b00 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
13b10 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
13b20 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
13b30 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
13b40 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
13b50 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
13b60 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
13b70 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
13b80 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
13b90 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
13ba0 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
13bb0 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
13bc0 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
13bd0 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
13be0 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
13bf0 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
13c00 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
13c10 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
13c20 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
13c30 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
13c40 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
13c50 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
13c60 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
13c70 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
13c80 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
13c90 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
13ca0 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
13cb0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
13cc0 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
13cd0 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
13ce0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
13cf0 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
13d00 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
13d10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13d20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
13d30 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
13d40 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
13d50 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
13d60 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13d70 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
13d80 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
13d90 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
13da0 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
13db0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13dc0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13dd0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13df0 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
13e00 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
13e10 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
13e20 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
13e30 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
13e40 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
13e50 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
13e60 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
13e70 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
13e80 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d  pDb==0 && (isMem
13e90 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61  db==0 || (vfsFla
13ea0 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  gs&SQLITE_OPEN_U
13eb0 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  RI)!=0) ){.    i
13ec0 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51  f( vfsFlags & SQ
13ed0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
13ee0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69  CACHE ){.      i
13ef0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nt nFilename = s
13f00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13f10 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
13f20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
13f30 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
13f40 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
13f50 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
13f60 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
13f70 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61  lloc(MAX(nFullPa
13f80 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65  thname,nFilename
13f90 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ));.      MUTEX_
13fa0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
13fb0 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
13fc0 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73  d; )..      p->s
13fd0 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
13fe0 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
13ff0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
14000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
14010 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
14020 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14040 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
14050 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
14060 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
14070 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b  ame, nFilename);
14080 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14090 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
140a0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
140b0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
140c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140e0 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61       nFullPathna
140f0 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
14100 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
14110 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
14120 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
14130 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
14140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
14150 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
14160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
14180 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
14190 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78  SAFE.      mutex
141a0 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
141b0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
141c0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
141d0 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
141e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
141f0 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
14200 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
14210 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
14220 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
14230 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
14240 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14250 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
14260 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
14270 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
14280 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
14290 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
142a0 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
142b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
142c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
142d0 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
142e0 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
142f0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
14300 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
14310 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  me(pBt->pPager, 
14320 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
14330 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
14340 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
14350 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
14360 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
14370 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
14380 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
14390 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
143a0 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
143b0 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
143c0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
143d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
143e0 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
143f0 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
14400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
14410 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14420 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
14430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14440 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14450 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
14460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14470 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
14480 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
14490 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
144a0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
144b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
144c0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
144d0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
144e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
144f0 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
14500 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
14510 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
14520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14540 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
14550 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
14560 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
14570 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
14580 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
14590 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
145a0 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
145b0 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
145c0 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
145d0 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
145e0 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
145f0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
14600 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
14610 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
14620 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
14630 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
14640 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
14650 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
14660 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
14670 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
14680 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
14690 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
146a0 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
146b0 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
146c0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
146d0 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
146e0 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
146f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
14700 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
14710 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
14720 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
14730 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
14740 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
14750 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
14760 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
14770 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
14780 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
14790 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
147a0 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
147b0 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
147c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
147d0 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
147e0 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
147f0 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
14800 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
14810 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
14820 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
14830 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
14840 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14850 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
14860 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
14870 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
14880 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
14890 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
148a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
148b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
148c0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
148d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
148e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
148f0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
14900 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
14910 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
14930 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
14940 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
14950 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
14960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14970 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14980 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
14990 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
149a0 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
149b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
149c0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
149d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
149e0 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
149f0 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
14a00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14a10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14a20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
14a30 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
14a40 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
14a50 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
14a60 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
14a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14a80 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
14a90 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
14aa0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
14ab0 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
14ac0 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
14ad0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
14ae0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
14af0 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
14b00 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
14b10 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
14b20 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
14b30 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
14b40 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
14b50 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
14b60 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
14b70 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
14b80 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
14b90 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
14ba0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
14bb0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
14bc0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
14bd0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
14be0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
14bf0 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
14c00 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
14c10 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
14c20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
14c30 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
14c40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14c50 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
14c60 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
14c70 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
14c80 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
14c90 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
14ca0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
14cb0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
14cc0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
14cd0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
14ce0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
14cf0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
14d00 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
14d10 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
14d20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14d30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14d40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
14d50 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
14d60 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
14d70 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
14d80 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
14d90 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
14da0 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
14db0 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
14dc0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
14dd0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
14de0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
14df0 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
14e00 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
14e10 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
14e20 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
14e30 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
14e40 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
14e50 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
14e60 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
14e70 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
14e80 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
14e90 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
14ea0 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
14eb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14ec0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
14ed0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
14ee0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
14ef0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
14f00 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
14f10 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
14f20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
14f30 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
14f40 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
14f50 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
14f60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
14f70 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
14f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14f90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
14fa0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
14fb0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
14fc0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
14fd0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
14fe0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
14ff0 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
15000 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
15010 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
15020 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
15030 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
15040 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
15050 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
15060 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
15070 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15080 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
15090 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
150a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
150b0 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
150c0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
150d0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
150e0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
150f0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
15100 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
15110 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
15120 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
15130 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
15140 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15150 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
15160 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
15170 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
15180 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
15190 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
151a0 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
151b0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
151c0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
151d0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
151e0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
151f0 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
15200 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
15210 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
15220 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
15230 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15240 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
15250 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15260 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
15270 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
15280 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
15290 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
152a0 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
152b0 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
152c0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
152d0 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
152e0 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
152f0 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
15300 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
15310 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
15320 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
15330 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
15340 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15350 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
15360 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
15370 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
15380 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
15390 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
153a0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
153b0 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
153c0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
153d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
153e0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
153f0 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
15400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
15410 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
15420 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
15430 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
15440 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
15450 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
15460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15470 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
15480 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
15490 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
154a0 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
154b0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
154c0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
154d0 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
154e0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
154f0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15500 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
15510 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15520 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
15530 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
15540 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
15550 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
15560 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
15570 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15580 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
15590 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
155a0 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
155b0 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
155c0 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
155d0 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
155e0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
155f0 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
15600 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
15610 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
15620 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
15630 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
15640 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
15650 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
15660 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
15670 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
15680 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
15690 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
156a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
156b0 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
156c0 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
156d0 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
156e0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
156f0 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
15700 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
15710 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
15720 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
15730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
15740 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
15750 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
15760 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
15770 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
15780 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15790 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
157a0 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
157b0 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
157c0 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
157d0 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
157e0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
157f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15800 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
15810 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
15820 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
15830 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
15840 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
15850 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
15860 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
15870 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15880 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
15890 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
158a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
158b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
158c0 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
158d0 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
158e0 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
158f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15900 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
15910 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
15920 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
15930 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
15940 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
15950 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
15960 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
15970 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
15980 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
15990 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
159a0 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
159b0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
159c0 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
159d0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
159e0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
159f0 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
15a00 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
15a10 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
15a20 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
15a30 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
15a40 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
15a50 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
15a60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
15a70 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
15a80 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
15a90 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
15aa0 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
15ab0 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
15ac0 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
15ad0 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ZE);.    }.  }. 
15ae0 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
15af0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
15b00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15b10 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
15b20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15b30 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
15b40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15b50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
15b60 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
15b70 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
15b80 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
15b90 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
15ba0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
15bb0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
15bc0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
15bd0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
15be0 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
15bf0 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
15c00 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
15c10 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
15c20 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
15c30 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
15c40 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
15c50 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
15c60 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
15c70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15c80 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
15c90 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
15ca0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
15cb0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
15cc0 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
15cd0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
15ce0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15cf0 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
15d00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
15d10 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
15d20 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
15d30 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15d40 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
15d50 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
15d60 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
15d70 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
15d80 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
15d90 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
15da0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
15db0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15dc0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
15dd0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
15de0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15df0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15e00 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
15e10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15e20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
15e30 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15e40 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15e50 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
15e60 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
15e70 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
15e80 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
15e90 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
15ea0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
15eb0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
15ec0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
15ed0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
15ee0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15ef0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
15f00 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
15f10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15f20 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
15f30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
15f40 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
15f50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
15f60 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
15f70 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
15f80 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
15f90 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
15fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
15fb0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
15fc0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
15fd0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
15fe0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
15ff0 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
16000 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
16010 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
16020 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
16030 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
16040 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
16050 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
16060 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
16070 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
16080 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
16090 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
160a0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
160b0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
160c0 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
160d0 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
160e0 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
160f0 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
16100 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
16110 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
16120 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
16130 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
16140 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
16150 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
16160 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
16170 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
16180 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
16190 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
161a0 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
161b0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
161c0 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
161d0 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
161e0 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
161f0 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
16200 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
16210 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
16220 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
16230 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
16240 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
16250 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
16260 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
16270 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
16280 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
16290 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
162a0 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
162b0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
162c0 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
162d0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
162e0 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
162f0 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
16300 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
16310 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
16320 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
16330 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16340 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
16350 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16360 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
16370 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
16380 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
16390 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
163a0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
163b0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
163c0 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
163d0 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
163e0 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
163f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
16400 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
16410 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16420 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16430 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
16440 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
16450 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
16460 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
16470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
16480 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
16490 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
164a0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
164b0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
164c0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
164d0 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
164e0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
164f0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16500 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
16510 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
16520 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
16530 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
16540 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
16550 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
16560 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
16570 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
16580 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
16590 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
165a0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
165b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
165c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
165d0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
165e0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
165f0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
16600 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
16610 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16620 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
16630 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
16640 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
16650 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
16660 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
16670 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
16680 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
16690 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
166a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
166b0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
166c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
166d0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
166e0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
166f0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
16700 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
16710 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
16720 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
16730 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
16740 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
16750 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
16760 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
16770 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
16780 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
16790 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
167a0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
167b0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
167c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
167d0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
167e0 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
167f0 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
16800 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
16810 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
16820 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
16830 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
16840 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
16850 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
16860 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
16870 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
16880 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
16890 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
168a0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
168b0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
168c0 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
168d0 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
168e0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
168f0 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
16900 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
16910 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
16920 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
16930 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
16940 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
16950 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16960 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
16970 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
16980 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
16990 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
169a0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
169b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
169c0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
169d0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
169e0 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
169f0 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
16a00 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
16a10 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
16a20 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
16a30 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
16a40 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
16a50 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
16a60 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
16a70 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
16a80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16a90 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16aa0 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
16ab0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
16ac0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
16ad0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
16ae0 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
16af0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
16b00 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
16b10 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
16b20 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
16b30 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
16b40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
16b50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16b60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
16b70 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
16b80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16b90 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
16ba0 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
16bb0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
16bc0 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
16bd0 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
16be0 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
16bf0 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
16c00 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
16c10 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
16c20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
16c30 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
16c40 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
16c50 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
16c60 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
16c70 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
16c80 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
16c90 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
16ca0 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
16cb0 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
16cc0 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
16cd0 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
16ce0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
16cf0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
16d00 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
16d10 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
16d20 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
16d30 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
16d40 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
16d50 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
16d60 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
16d70 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
16d80 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
16d90 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
16da0 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
16db0 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
16dc0 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
16dd0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
16de0 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
16df0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
16e00 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
16e10 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
16e20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16e30 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
16e40 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
16e50 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
16e60 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16e70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16e80 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16e90 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16ea0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16eb0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16ec0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
16ed0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
16ee0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
16ef0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16f10 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
16f20 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
16f30 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16f40 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
16f50 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
16f60 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
16f70 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
16f80 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
16f90 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
16fa0 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
16fb0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
16fc0 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
16fd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16fe0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
16ff0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17000 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
17010 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17020 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
17030 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
17040 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
17050 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
17060 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17070 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17080 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
17090 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
170a0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
170b0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
170c0 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
170d0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
170e0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
170f0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
17100 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
17110 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
17120 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
17130 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
17140 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
17150 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
17160 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
17170 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
17180 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
17190 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
171a0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
171b0 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
171c0 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
171d0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
171e0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
171f0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
17200 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
17210 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
17220 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
17230 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
17240 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
17250 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
17260 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
17270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
17280 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
17290 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
172a0 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
172b0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
172c0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
172d0 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
172e0 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
172f0 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
17300 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
17310 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
17320 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
17330 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17340 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17350 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17360 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
17370 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17380 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
17390 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
173a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
173b0 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
173c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
173d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
173e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
173f0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
17400 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
17410 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
17420 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
17430 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
17440 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
17450 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
17460 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
17470 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17480 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
17490 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
174a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
174b0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
174c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
174d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
174e0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
174f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17500 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
17510 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
17520 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
17530 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
17540 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
17550 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17560 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17570 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
17580 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
17590 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
175a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
175b0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
175c0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
175d0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
175e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
175f0 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
17600 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
17610 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
17620 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
17630 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
17640 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
17650 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
17660 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
17670 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
17680 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
17690 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
176a0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
176b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
176c0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
176d0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
176e0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
176f0 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
17700 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
17710 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
17720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17730 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
17740 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
17750 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
17760 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
17770 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
17780 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
17790 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
177a0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
177b0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
177c0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
177d0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
177e0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
177f0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
17800 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
17810 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
17820 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
17830 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
17840 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
17850 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
17860 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
17870 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
17880 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
17890 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
178a0 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
178b0 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
178c0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
178d0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
178e0 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
178f0 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
17900 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
17910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
17920 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17930 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
17940 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
17950 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
17960 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17970 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49  ter(p);.#if SQLI
17980 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
17990 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d  f( nReserve>pBt-
179a0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
179b0 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ) pBt->optimalRe
179c0 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73  serve = (u8)nRes
179d0 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  erve;.#endif.  i
179e0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
179f0 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
17a00 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
17a10 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17a20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17a30 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
17a40 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
17a50 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
17a60 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
17a70 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
17a80 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
17a90 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
17aa0 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
17ab0 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
17ac0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
17ad0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
17ae0 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
17af0 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
17b00 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
17b10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17b20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
17b30 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17b40 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
17b50 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
17b60 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
17b70 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
17b80 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
17b90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17ba0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
17bb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
17bc0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
17bd0 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
17be0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
17bf0 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
17c00 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
17c10 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
17c20 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
17c30 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
17c40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17c50 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
17c60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17c70 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
17c80 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
17c90 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
17ca0 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
17cb0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
17cc0 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
17cd0 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
17ce0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
17cf0 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
17d00 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
17d10 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
17d20 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
17d30 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
17d40 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
17d50 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
17d60 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
17d70 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
17d80 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
17d90 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
17da0 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
17db0 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
17dc0 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
17dd0 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
17de0 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
17df0 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
17e00 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
17e10 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
17e20 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
17e30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
17e40 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
17e50 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
17e60 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
17e70 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
17e80 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
17e90 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
17ea0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17eb0 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
17ec0 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
17ed0 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
17ee0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
17ef0 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
17f00 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
17f10 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   n;.  assert( sq
17f20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17f30 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
17f40 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
17f50 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
17f60 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
17f70 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
17f80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17f90 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17fa0 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
17fb0 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
17fc0 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
17fd0 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
17fe0 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
17ff0 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
18000 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
18010 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
18020 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a  y extensions..**
18030 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41  .** If SQLITE_HA
18040 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e  S_MUTEX is defin
18050 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed then the numb
18060 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  er returned is t
18070 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66  he.** greater of
18080 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
18090 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20  erved space and 
180a0 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75  the maximum requ
180b0 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65  ested.** reserve
180c0 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73   space..*/.int s
180d0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70  qlite3BtreeGetOp
180e0 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72  timalReserve(Btr
180f0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
18100 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18110 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
18120 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
18130 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b  serveNoMutex(p);
18140 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
18150 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
18160 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  <p->pBt->optimal
18170 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d  Reserve ) n = p-
18180 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
18190 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73  erve;.#endif.  s
181a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
181b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
181c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
181d0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
181e0 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
181f0 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
18200 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
18210 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
18220 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
18230 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
18240 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
18250 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
18260 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
18270 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
18280 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
18290 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
182a0 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
182b0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
182c0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
182d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
182e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
182f0 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
18300 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
18310 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
18320 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18330 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
18340 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45 43   Set the BTS_SEC
18350 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20  URE_DELETE flag 
18360 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20  if newFlag is 0 
18370 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61  or 1.  If newFla
18380 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e  g is -1,.** then
18390 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   make no changes
183a0 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
183b0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
183c0 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
183d0 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61  ETE.** setting a
183e0 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e  fter the change.
183f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18400 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
18410 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
18420 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
18430 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
18440 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
18450 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18460 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
18470 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
18480 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
18490 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
184a0 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67  .    if( newFlag
184b0 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c   ) p->pBt->btsFl
184c0 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
184d0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20  E_DELETE;.  } . 
184e0 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74   b = (p->pBt->bt
184f0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
18500 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a  URE_DELETE)!=0;.
18510 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18520 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
18530 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   b;.}../*.** Cha
18540 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
18550 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
18560 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
18570 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
18580 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
18590 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
185a0 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
185b0 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
185c0 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
185d0 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
185e0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
185f0 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
18600 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
18610 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
18620 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
18630 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
18640 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
18650 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
18660 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
18670 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
18680 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
18690 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
186a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
186b0 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
186c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
186d0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
186e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
186f0 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
18700 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
18710 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18720 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  ;.  if( (pBt->bt
18730 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
18740 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20  ESIZE_FIXED)!=0 
18750 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
18760 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
18770 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18780 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
18790 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
187a0 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
187b0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
187c0 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
187d0 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
187e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
187f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
18800 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
18810 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
18820 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
18830 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
18840 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
18850 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
18860 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
18870 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
18880 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
18890 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
188a0 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
188b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
188c0 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
188d0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
188e0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
188f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18900 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
18910 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
18920 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
18930 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
18940 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
18950 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
18960 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
18970 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
18980 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
18990 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
189a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
189b0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
189c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
189d0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
189e0 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
189f0 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
18a00 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
18a10 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
18a20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
18a30 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
18a40 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
18a50 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
18a60 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
18a70 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
18a80 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
18a90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
18aa0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
18ab0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
18ac0 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
18ad0 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
18ae0 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
18af0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
18b00 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
18b10 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
18b20 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
18b30 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
18b40 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18b50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
18b60 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
18b70 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d  nctions */.  Mem
18b80 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
18b90 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74    /* Page 1 of t
18ba0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18bb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
18bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18bd0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
18be0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
18bf0 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65  .  int nPageFile
18c00 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
18c10 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
18c20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18c30 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65  */.  int nPageHe
18c40 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  ader;     /* Num
18c50 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18c60 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63  the database acc
18c70 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f  ording to hdr */
18c80 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
18c90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18ca0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18cb0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
18cc0 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
18cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
18ce0 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
18cf0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
18d00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
18d10 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74  rn rc;.  rc = bt
18d20 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
18d30 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
18d40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18d50 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
18d60 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
18d70 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
18d80 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
18d90 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
18da0 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
18db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
18dc0 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20  .  */.  nPage = 
18dd0 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65  nPageHeader = ge
18de0 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
18df0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
18e00 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
18e10 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
18e20 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b  er, &nPageFile);
18e30 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
18e40 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38  || memcmp(24+(u8
18e50 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
18e60 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d   92+(u8*)pPage1-
18e70 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a  >aData,4)!=0 ){.
18e80 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
18e90 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eFile;.  }.  if(
18ea0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
18eb0 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32 pageSize;.  
18ec0 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65    u32 usableSize
18ed0 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
18ee0 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
18ef0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18f00 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20  _NOTADB;.    /* 
18f10 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
18f20 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79  3737-39999 Every
18f30 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
18f40 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69  tabase file begi
18f50 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ns.    ** with t
18f60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20  he following 16 
18f70 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20  bytes (in hex): 
18f80 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36  53 51 4c 69 74 6
18f90 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64  5 20 66 6f 72 6d
18fa0 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30  .    ** 61 74 20
18fb0 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69   33 00. */.    i
18fc0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
18fd0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
18fe0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
18ff0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
19000 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
19010 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
19020 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
19030 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
19040 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
19050 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
19060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19070 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
19080 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
19090 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
190a0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
190b0 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a   page1[18]>2 ){.
190c0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
190d0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
190e0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
190f0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
19100 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19110 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
19130 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
19140 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
19150 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
19160 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
19170 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
19180 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
19190 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
191a0 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
191b0 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
191c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
191d0 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
191e0 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
191f0 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
19200 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
19210 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
19220 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
19230 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
19240 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
19250 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
19260 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
19270 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
19280 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
19290 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
192a0 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
192b0 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
192c0 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
192d0 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
192e0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
192f0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
19300 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
19310 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
19320 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
19330 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
19340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
19350 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
19360 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e  >pPager, &isOpen
19370 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19390 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
193a0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
193b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
193c0 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
193d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
193e0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
193f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19410 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
19420 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  DB;.    }.#endif
19430 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
19440 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30  E-OF: R-15465-20
19450 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  813 The maximum 
19460 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65  and minimum embe
19470 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20  dded payload.   
19480 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e   ** fractions an
19490 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f  d the leaf paylo
194a0 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75  ad fraction valu
194b0 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33  es must be 64, 3
194c0 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a  2, and 32..    *
194d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  *.    ** The ori
194e0 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
194f0 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
19500 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
19510 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
19520 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
19530 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
19540 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
19550 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
19560 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
19570 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
19580 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19590 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
195a0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
195b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
195c0 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
195d0 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
195e0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
195f0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
19600 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
19610 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
19620 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
19630 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
19640 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
19650 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19660 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61   file. */.    pa
19670 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
19680 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
19690 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f  [17]<<16);.    /
196a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
196b0 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65  -25008-21688 The
196c0 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
196d0 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
196e0 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e  o.    ** between
196f0 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69   512 and 65536 i
19700 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20  nclusive. */.   
19710 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
19720 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
19730 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
19740 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
19750 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
19760 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
19770 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
19780 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
19790 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
197a0 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
197b0 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a   7)==0 );.    /*
197c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
197d0 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20  59310-51205 The 
197e0 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22  "reserved space"
197f0 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62   size in the 1-b
19800 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  yte.    ** integ
19810 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20  er at offset 20 
19820 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19830 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
19840 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20  at the end of.  
19850 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74    ** each page t
19860 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78  o reserve for ex
19870 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a  tensions. .    *
19880 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  *.    ** EVIDENC
19890 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
198a0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
198b0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
198c0 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ion is.    ** de
198d0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
198e0 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
198f0 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
19900 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
19910 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  20.    ** into t
19920 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19930 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
19940 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
19950 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
19960 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
19970 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
19980 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
19990 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
199a0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
199b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
199c0 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
199d0 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
199e0 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
199f0 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
19a00 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
19a10 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
19a20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
19a30 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
19a40 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
19a50 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
19a60 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
19a70 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
19a80 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
19a90 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
19aa0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
19ab0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
19ac0 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
19ad0 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
19ae0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
19af0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
19b00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
19b10 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
19b20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
19b30 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
19b40 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
19b50 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
19b60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
19b70 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
19b80 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
19b90 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bb0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
19bc0 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
19bd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
19be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19bf0 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
19c00 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
19c10 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61  yMode)==0 && nPa
19c20 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
19c30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19c40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19c50 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19c60 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19c70 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
19c80 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d  NCE-OF: R-28312-
19c90 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74  64704 However, t
19ca0 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69  he usable size i
19cb0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
19cc0 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20  .    ** be less 
19cd0 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68  than 480. In oth
19ce0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
19cf0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31   page size is 51
19d00 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  2, then the.    
19d10 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63  ** reserved spac
19d20 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78  e size cannot ex
19d30 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20  ceed 32. */.    
19d40 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
19d50 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
19d60 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
19d70 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
19d80 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
19d90 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
19da0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
19db0 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
19dc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
19dd0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
19de0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
19df0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
19e00 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
19e10 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
19e20 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
19e30 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
19e40 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
19e50 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
19e60 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
19e70 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
19e80 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
19e90 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
19ea0 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
19eb0 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
19ec0 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
19ed0 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
19ee0 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
19ef0 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
19f00 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
19f10 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
19f20 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
19f30 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
19f40 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
19f50 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
19f60 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
19f70 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
19f80 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
19f90 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
19fa0 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
19fb0 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
19fc0 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
19fd0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
19fe0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
19ff0 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
1a000 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
1a010 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
1a020 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
1a030 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
1a040 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
1a050 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
1a060 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
1a070 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
1a080 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
1a090 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
1a0a0 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
1a0b0 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
1a0c0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1a0d0 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
1a0e0 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
1a0f0 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
1a100 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
1a110 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
1a120 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
1a130 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1a140 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
1a150 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
1a160 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
1a170 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
1a180 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
1a190 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
1a1a0 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
1a1b0 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
1a1c0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
1a1d0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1a1e0 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
1a1f0 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
1a200 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
1a210 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
1a220 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
1a230 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
1a240 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
1a250 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1a260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
1a270 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
1a280 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1a290 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
1a2a0 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
1a2b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1a2c0 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
1a2d0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1a2e0 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65  r of cursors ope
1a2f0 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69  n on pBt. This i
1a300 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
1a310 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
1a320 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
1a330 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
1a340 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
1a350 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
1a360 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
1a370 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69  rs are counted i
1a380 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65  f wrOnly is true
1a390 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a  .  If wrOnly is.
1a3a0 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c  ** false then al
1a3b0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  l cursors are co
1a3c0 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  unted..**.** For
1a3d0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
1a3e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
1a3f0 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63   cursor is any c
1a400 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
1a410 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64   capable of read
1a420 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1a430 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
1a440 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
1a450 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
1a460 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
1a470 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
1a480 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
1a490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1a4a0 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
1a4b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
1a4c0 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
1a4d0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
1a4e0 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
1a4f0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
1a500 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
1a510 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
1a520 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
1a530 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
1a540 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
1a550 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
1a560 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
1a570 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
1a580 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
1a590 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
1a5a0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
1a5b0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1a5c0 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
1a5d0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
1a5e0 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
1a5f0 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
1a600 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
1a610 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1a620 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
1a630 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
1a640 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1a650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a660 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
1a670 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
1a680 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
1a690 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
1a6a0 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
1a6b0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1a6c0 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
1a6d0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1a6e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
1a6f0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1a700 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1a710 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1a720 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1a730 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1a740 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
1a750 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
1a760 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
1a770 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
1a780 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
1a790 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1a7a0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
1a7b0 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
1a7c0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1a7d0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1a7e0 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e1;.    assert( 
1a7f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
1a800 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1a810 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1a820 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
1a830 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  1 );.    pBt->pP
1a840 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65  age1 = 0;.    re
1a850 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
1a860 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
1a870 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
1a880 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
1a890 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
1a8a0 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
1a8b0 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
1a8c0 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
1a8d0 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
1a8e0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1a8f0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1a900 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a910 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
1a920 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
1a930 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
1a940 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
1a950 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
1a960 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a970 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1a980 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
1a990 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
1a9a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a9b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
1a9c0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1a9d0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
1a9e0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
1a9f0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
1aa00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1aa10 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
1aa20 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1aa30 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
1aa40 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
1aa50 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
1aa60 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
1aa70 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
1aa80 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
1aa90 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
1aaa0 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1aab0 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
1aac0 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
1aad0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
1aae0 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
1aaf0 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
1ab00 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
1ab10 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
1ab20 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
1ab30 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
1ab40 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
1ab50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
1ab60 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
1ab70 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
1ab80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
1ab90 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
1aba0 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
1abb0 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
1abc0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
1abd0 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
1abe0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
1abf0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
1ac00 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
1ac10 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
1ac20 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
1ac30 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
1ac40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ac50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
1ac60 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
1ac70 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
1ac80 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
1ac90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1aca0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
1acb0 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
1acc0 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
1acd0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
1ace0 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
1acf0 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
1ad00 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
1ad10 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
1ad20 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
1ad30 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
1ad40 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
1ad50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ad60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1ad70 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
1ad80 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1ad90 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
1ada0 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
1adb0 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
1adc0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
1add0 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
1ade0 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
1adf0 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
1ae00 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1ae10 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1ae20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
1ae30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1ae40 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
1ae50 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1ae60 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1ae70 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
1ae80 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
1ae90 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
1aea0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1aeb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1aec0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1aed0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
1aee0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
1aef0 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
1af00 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
1af10 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
1af20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1af30 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
1af40 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
1af50 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
1af60 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1af70 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
1af80 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
1af90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1afa0 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
1afb0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
1afc0 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
1afd0 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
1afe0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
1aff0 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
1b000 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
1b010 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
1b020 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
1b030 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1b040 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
1b050 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
1b060 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
1b070 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
1b080 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1b090 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1b0a0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1b0b0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
1b0c0 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
1b0d0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
1b0e0 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
1b0f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1b100 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
1b110 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
1b120 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1b130 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
1b140 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
1b150 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
1b160 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1b170 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
1b180 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
1b190 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1b1a0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1b1b0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
1b1c0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1b1d0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
1b1e0 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
1b1f0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
1b200 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1b210 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
1b220 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
1b230 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
1b240 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
1b250 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
1b260 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
1b270 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
1b280 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
1b290 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
1b2a0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
1b2b0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
1b2c0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1b2d0 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
1b2e0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1b2f0 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
1b300 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
1b310 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
1b320 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
1b330 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
1b340 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
1b350 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
1b360 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
1b370 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
1b380 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
1b390 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
1b3a0 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
1b3b0 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
1b3c0 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
1b3d0 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
1b3e0 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
1b3f0 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
1b400 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
1b410 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
1b420 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
1b430 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
1b440 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
1b450 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
1b460 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
1b470 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
1b480 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
1b490 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
1b4a0 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
1b4b0 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
1b4c0 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
1b4d0 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
1b4e0 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
1b4f0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
1b500 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
1b510 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
1b520 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
1b530 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
1b540 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
1b550 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
1b560 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b570 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
1b580 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
1b590 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
1b5a0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
1b5b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1b5c0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
1b5d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
1b5e0 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20 28   bConcurrent = (
1b5f0 70 2d 3e 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65  p->db->bConcurre
1b600 6e 74 20 26 26 20 21 49 53 41 55 54 4f 56 41 43  nt && !ISAUTOVAC
1b610 55 55 4d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  UUM);..  sqlite3
1b620 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1b630 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1b640 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
1b650 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
1b660 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
1b670 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
1b680 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
1b690 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
1b6a0 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
1b6b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
1b6c0 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
1b6d0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
1b6e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1b6f0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1b700 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
1b710 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
1b720 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
1b730 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1b740 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  un;.  }.  assert
1b750 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1b760 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1b770 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56  E || IfNotOmitAV
1b780 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
1b790 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  e)==0 );..  /* W
1b7a0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b7b0 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
1b7c0 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
1b7d0 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
1b7e0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1b7f0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1b800 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67  LY)!=0 && wrflag
1b810 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1b820 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1b830 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1b840 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
1b850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1b860 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49  RED_CACHE.  /* I
1b870 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
1b880 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
1b890 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
1b8a0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b8b0 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
1b8c0 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
1b8d0 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
1b8e0 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
1b8f0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
1b900 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1b910 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1b920 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67  */.  if( (wrflag
1b930 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1b940 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1b950 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d  ITE).   || (pBt-
1b960 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1b970 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b  PENDING)!=0.  ){
1b980 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
1b990 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
1b9a0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
1b9b0 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
1b9c0 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
1b9d0 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1b9e0 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1b9f0 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1ba00 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
1ba10 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1ba20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
1ba30 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
1ba40 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
1ba50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ba60 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
1ba70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
1ba80 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1ba90 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1baa0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1bab0 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1bac0 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
1bad0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
1bae0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
1baf0 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
1bb00 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
1bb10 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
1bb20 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
1bb30 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
1bb40 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
1bb50 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
1bb60 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
1bb70 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
1bb80 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
1bb90 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
1bba0 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
1bbb0 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
1bbc0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1bbd0 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
1bbe0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
1bbf0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
1bc00 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1bc10 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  ;..  pBt->btsFla
1bc20 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49  gs &= ~BTS_INITI
1bc30 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66  ALLY_EMPTY;.  if
1bc40 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20  ( pBt->nPage==0 
1bc50 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1bc60 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  |= BTS_INITIALLY
1bc70 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20  _EMPTY;.  do {. 
1bc80 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
1bc90 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
1bca0 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
1bcb0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
1bcc0 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
1bcd0 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1bce0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
1bcf0 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
1bd00 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
1bd10 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1bd20 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
1bd30 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
1bd40 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
1bd50 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
1bd60 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
1bd70 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
1bd80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1bd90 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
1bda0 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
1bdb0 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
1bdc0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
1bdd0 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
1bde0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
1bdf0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
1be00 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1be10 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
1be20 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
1be30 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
1be40 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
1be50 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
1be60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1be70 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
1be80 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e        if( (pBt->
1be90 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1bea0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  EAD_ONLY)!=0 ){.
1beb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1bec0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1bed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bee0 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20 3d 20     int exFlag = 
1bef0 62 43 6f 6e 63 75 72 72 65 6e 74 20 3f 20 2d 31  bConcurrent ? -1
1bf00 20 3a 20 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20   : (wrflag>1);. 
1bf10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1bf20 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
1bf30 74 2d 3e 70 50 61 67 65 72 2c 20 65 78 46 6c 61  t->pPager, exFla
1bf40 67 2c 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  g, sqlite3TempIn
1bf50 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
1bf60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1bf70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bf80 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
1bf90 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1bfa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1bfb0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1bfc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bfd0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
1bfe0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1bff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
1c000 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
1c010 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
1c020 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1c030 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
1c040 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
1c050 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
1c060 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
1c070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c080 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1c090 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
1c0a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1c0b0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
1c0c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c0d0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1c0e0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
1c0f0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
1c100 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
1c110 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
1c120 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
1c130 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1c140 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
1c150 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
1c160 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
1c170 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
1c180 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
1c190 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
1c1a0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
1c1b0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
1c1c0 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
1c1d0 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
1c1e0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1c1f0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c200 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
1c210 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1c220 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
1c230 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
1c240 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
1c250 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1c260 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
1c270 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1c280 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1c290 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
1c2a0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
1c2b0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
1c2c0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
1c2d0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
1c2e0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
1c2f0 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
1c300 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1c310 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
1c320 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
1c330 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
1c340 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
1c350 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
1c360 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
1c370 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
1c380 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
1c390 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c3a0 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
1c3b0 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
1c3c0 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
1c3d0 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
1c3e0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1c3f0 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
1c400 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
1c410 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
1c420 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
1c430 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
1c440 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
1c450 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
1c460 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
1c470 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
1c480 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1c490 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1c4a0 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
1c4b0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
1c4c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1c4d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c4e0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1c4f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1c500 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c510 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1c520 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1c530 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1c540 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1c550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c560 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 23  ..trans_begun:.#
1c570 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c580 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20  IT_CONCURRENT.  
1c590 69 66 28 20 62 43 6f 6e 63 75 72 72 65 6e 74 20  if( bConcurrent 
1c5a0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1c5b0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
1c5c0 49 73 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  IsWal(pBt->pPage
1c5d0 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  r) ){.    rc = s
1c5e0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1c5f0 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d 3e  Concurrent(pBt->
1c600 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1c610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c620 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1c630 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d    rc = btreePtrm
1c640 61 70 41 6c 6c 6f 63 61 74 65 28 70 42 74 29 3b  apAllocate(pBt);
1c650 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1c660 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  f..  if( rc==SQL
1c670 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1c680 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1c690 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1c6a0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1c6b0 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1c6c0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1c6d0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1c6e0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1c6f0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1c700 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1c710 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1c720 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1c730 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1c740 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1c750 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1c760 20 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e     int nSavepoin
1c770 74 20 3d 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  t = p->db->nSave
1c780 70 6f 69 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20  point;.    rc = 
1c790 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1c7a0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1c7b0 50 61 67 65 72 2c 20 6e 53 61 76 65 70 6f 69 6e  Pager, nSavepoin
1c7c0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1c7d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 53 61  SQLITE_OK && nSa
1c7e0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20  vepoint ){.     
1c7f0 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61   rc = btreePtrma
1c800 70 42 65 67 69 6e 28 70 42 74 2c 20 6e 53 61 76  pBegin(pBt, nSav
1c810 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
1c820 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1c830 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
1c840 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1c850 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c870 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1c880 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
1c890 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
1c8a0 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
1c8b0 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
1c8c0 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
1c8d0 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
1c8e0 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
1c8f0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1c900 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
1c910 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
1c920 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
1c930 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
1c940 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1c950 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
1c960 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1c970 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
1c9a0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
1c9b0 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
1c9e0 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
1c9f0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1ca20 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
1ca30 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1ca40 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
1ca50 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
1ca60 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
1ca70 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
1ca80 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
1ca90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1caa0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1cab0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1cac0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1cad0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1cae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1caf0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
1cb00 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
1cb10 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
1cb20 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
1cb30 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
1cb40 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
1cb50 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1cb60 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
1cb70 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
1cb80 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
1cb90 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
1cba0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1cbb0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1cbc0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
1cbd0 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
1cbe0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
1cbf0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1cc00 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
1cc10 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
1cc20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1cc30 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
1cc40 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
1cc50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1cc60 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1cc70 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
1cc80 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1cc90 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1cca0 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65  o, &rc);.  }..se
1ccb0 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
1ccc0 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
1ccd0 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
1cce0 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
1ccf0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
1cd00 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
1cd10 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
1cd20 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
1cd30 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
1cd40 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1cd50 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
1cd60 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
1cd70 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
1cd80 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
1cd90 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
1cda0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
1cdb0 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
1cdc0 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1cdd0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1cde0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
1cdf0 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
1ce00 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1ce10 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
1ce20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1ce30 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
1ce40 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1ce50 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1ce60 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce80 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
1ce90 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
1cea0 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
1ceb0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1cec0 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
1ced0 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
1cee0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1cef0 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
1cf00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1cf10 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
1cf20 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
1cf30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1cf40 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1cf50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1cf60 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
1cf70 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
1cf80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cf90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1cfa0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1cfb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1cfc0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
1cfd0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
1cfe0 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
1cff0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1d000 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
1d010 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
1d020 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
1d030 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
1d040 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1d050 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
1d060 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1d070 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
1d080 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d090 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d0a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
1d0b0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1d0c0 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
1d0d0 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
1d0e0 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
1d0f0 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
1d100 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
1d110 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
1d120 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
1d130 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
1d140 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d150 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  c;.    nCell = p
1d160 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
1d170 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1d180 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
1d190 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1d1a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1d1b0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
1d1c0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1d1d0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
1d1e0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
1d1f0 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
1d200 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
1d210 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
1d220 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
1d230 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20  erflow.         
1d240 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  && pCell+info.iO
1d250 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65  verflow+3<=pPage
1d260 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
1d270 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20  askPage.        
1d280 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62   && iFrom==get4b
1d290 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
1d2a0 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20  iOverflow]).    
1d2b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1d2c0 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
1d2d0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
1d2e0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1d2f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1d300 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1d310 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
1d320 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
1d330 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
1d340 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
1d350 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1d360 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1d370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d380 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
1d390 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
1d3a0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
1d3b0 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
1d3c0 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
1d3d0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1d3e0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
1d3f0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1d400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1d410 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1d420 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
1d430 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1d440 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1d450 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
1d460 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
1d470 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
1d480 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
1d490 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1d4a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
1d4b0 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
1d4c0 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
1d4d0 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
1d4e0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
1d4f0 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
1d500 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
1d510 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
1d520 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
1d530 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1d540 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
1d550 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
1d560 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
1d570 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
1d580 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
1d590 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1d5a0 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
1d5b0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
1d5c0 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
1d5d0 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
1d5e0 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
1d5f0 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
1d600 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
1d610 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
1d620 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1d630 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
1d640 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
1d650 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
1d660 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
1d670 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d690 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
1d6a0 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
1d6b0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1d6c0 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
1d6d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d6e0 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
1d6f0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1d700 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
1d710 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
1d720 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
1d730 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
1d740 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1d750 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
1d760 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
1d770 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1d780 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
1d790 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
1d7a0 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
1d7b0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
1d7c0 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
1d7d0 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
1d7e0 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
1d7f0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
1d800 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1d810 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
1d820 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1d830 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1d840 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
1d850 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1d860 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
1d870 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1d880 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1d890 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
1d8a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d8b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1d8c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1d8d0 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
1d8e0 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
1d8f0 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
1d900 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
1d910 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
1d920 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
1d930 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
1d940 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
1d950 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
1d960 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
1d970 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
1d980 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
1d990 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
1d9a0 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
1d9b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1d9c0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
1d9d0 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
1d9e0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1d9f0 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
1da00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1da10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1da20 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
1da30 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
1da40 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
1da50 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
1da60 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
1da70 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
1da80 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
1da90 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
1daa0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1dab0 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
1dac0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1dad0 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
1dae0 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
1daf0 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
1db00 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
1db10 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1db20 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
1db30 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
1db40 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
1db50 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
1db60 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1db70 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
1db80 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
1db90 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1dba0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1dbb0 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
1dbc0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1dbd0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1dbe0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1dbf0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1dc00 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1dc10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
1dc20 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
1dc30 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1dc40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1dc50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1dc60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1dc70 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
1dc80 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
1dc90 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1dca0 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
1dcb0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1dcc0 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
1dcd0 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
1dce0 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
1dcf0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
1dd00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1dd10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1dd20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1dd30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
1dd40 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
1dd50 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
1dd60 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
1dd70 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
1dd80 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
1dd90 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
1dda0 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
1ddb0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1ddc0 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
1ddd0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1dde0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
1ddf0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1de00 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1de10 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
1de20 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
1de30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1de40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1de50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1de60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1de70 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
1de80 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1de90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dea0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
1deb0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1dec0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ded0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1dee0 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
1def0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
1df00 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1df10 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
1df20 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1df30 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1df40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1df50 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1df60 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
1df70 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1df80 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1df90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dfa0 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1dfb0 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
1dfc0 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
1dfd0 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
1dfe0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1dff0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
1e000 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
1e010 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
1e020 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
1e030 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
1e040 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
1e050 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
1e060 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
1e070 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
1e080 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
1e090 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
1e0a0 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
1e0b0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
1e0c0 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
1e0d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1e0e0 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
1e0f0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
1e100 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
1e110 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
1e120 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
1e130 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  fically, this fu
1e140 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
1e150 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
1e160 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a  he database so .
1e170 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ** that the last
1e180 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
1e190 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
1e1a0 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  se is no longer 
1e1b0 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  in use..**.** Pa
1e1c0 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20  rameter nFin is 
1e1d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1e1e0 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61  ges that this da
1e1f0 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e  tabase would con
1e200 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69  tain.** were thi
1e210 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  s function calle
1e220 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  d until it retur
1e230 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  ns SQLITE_DONE..
1e240 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f  **.** If the bCo
1e250 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69  mmit parameter i
1e260 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
1e270 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
1e280 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63  s that the .** c
1e290 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
1e2a0 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
1e2b0 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69  umStep() until i
1e2c0 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1e2d0 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20  _DONE .** or an 
1e2e0 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69  error. bCommit i
1e2f0 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f  s passed true fo
1e300 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1e310 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f  -on-commit .** o
1e320 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
1e330 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
1e340 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
1e350 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1e360 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
1e370 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1e380 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
1e390 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
1e3a0 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
1e3b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1e3c0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e3d0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
1e3e0 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
1e3f0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
1e400 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e410 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1e420 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
1e430 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
1e440 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
1e450 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
1e460 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
1e470 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e480 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
1e490 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
1e4a0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
1e4b0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
1e4c0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e4d0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
1e4e0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
1e4f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e500 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1e510 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
1e520 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
1e530 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
1e540 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1e550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e580 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1e590 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
1e5a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e5b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e5c0 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
1e5d0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1e5e0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
1e5f0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1e600 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
1e610 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1e620 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
1e630 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
1e640 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
1e650 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
1e660 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
1e670 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
1e680 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
1e690 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
1e6a0 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
1e6b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1e6c0 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
1e6d0 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
1e6e0 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
1e6f0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
1e700 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
1e710 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1e720 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
1e730 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
1e740 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1e750 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1e760 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1e770 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1e780 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
1e790 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
1e7a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1e7b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e7c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1e7d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e7e0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1e7f0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
1e800 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1e810 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1e820 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
1e830 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
1e840 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
1e850 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
1e860 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
1e870 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
1e880 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
1e890 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
1e8a0 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1e8b0 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
1e8c0 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1e8d0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1e8e0 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
1e8f0 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
1e900 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
1e910 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1e920 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1e930 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
1e940 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1e950 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
1e960 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
1e970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e980 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1e990 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
1e9a0 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
1e9b0 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
1e9c0 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
1e9d0 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
1e9e0 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
1e9f0 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
1ea00 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
1ea10 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
1ea20 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
1ea30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1ea40 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
1ea50 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
1ea60 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1ea70 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
1ea80 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
1ea90 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
1eaa0 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
1eab0 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
1eac0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1ead0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
1eae0 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
1eaf0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1eb00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1eb10 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
1eb20 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
1eb30 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
1eb40 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
1eb50 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1eb60 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1eb70 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1eb80 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1eb90 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
1eba0 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
1ebb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ebc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ebd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1ebe0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1ebf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ec00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ec10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1ec20 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
1ec30 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
1ec40 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
1ec50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1ec60 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
1ec70 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
1ec80 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
1ec90 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
1eca0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
1ecb0 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
1ecc0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1ecd0 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1ece0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ecf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ed00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ed10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1ed20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1ed30 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
1ed40 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
1ed50 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
1ed60 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1ed70 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
1ed80 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1ed90 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
1eda0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1edb0 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
1edc0 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
1edd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1ede0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1edf0 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
1ee00 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
1ee10 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1ee20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1ee30 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
1ee40 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
1ee50 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
1ee60 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
1ee70 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
1ee80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1ee90 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
1eea0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
1eeb0 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
1eec0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
1eed0 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
1eee0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1eef0 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
1ef00 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
1ef10 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
1ef20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ef30 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
1ef40 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
1ef50 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
1ef60 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1ef70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ef80 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
1ef90 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1efa0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efc0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1efd0 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
1efe0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
1eff0 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
1f000 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
1f010 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
1f020 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
1f030 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
1f040 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
1f050 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
1f060 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
1f070 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
1f080 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
1f090 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1f0a0 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
1f0b0 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1f0c0 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
1f0d0 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
1f0e0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1f0f0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1f100 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
1f110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
1f120 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1f130 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
1f140 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
1f150 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
1f160 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
1f170 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
1f180 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
1f190 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1f1a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
1f1b0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
1f1c0 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
1f1d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
1f1e0 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
1f1f0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
1f200 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
1f210 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
1f220 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
1f230 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1f240 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1f250 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
1f260 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
1f270 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f280 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
1f290 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1f2a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f2b0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
1f2c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f2d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1f2e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1f2f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
1f300 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1f310 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
1f320 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
1f330 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
1f340 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
1f350 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
1f360 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1f370 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
1f380 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
1f390 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f3a0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1f3b0 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
1f3c0 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1f3d0 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
1f3e0 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
1f3f0 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
1f400 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f410 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
1f420 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
1f430 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1f440 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1f450 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1f460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f470 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
1f480 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1f490 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1f4a0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1f4b0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
1f4c0 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
1f4d0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1f4e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f4f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f500 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1f510 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1f520 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
1f530 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f540 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1f550 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1f560 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1f570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1f580 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
1f590 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1f5a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1f5b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1f5c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1f5d0 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
1f5e0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
1f5f0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
1f600 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
1f610 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
1f620 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
1f630 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1f640 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
1f650 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
1f660 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1f670 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
1f680 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f690 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
1f6a0 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
1f6b0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
1f6c0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
1f6d0 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1f6e0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
1f6f0 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
1f700 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
1f710 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
1f720 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f730 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1f740 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
1f750 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1f760 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1f770 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1f780 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
1f790 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
1f7a0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1f7b0 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20  nt(pPager); ).. 
1f7c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f7d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1f7e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
1f7f0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1f800 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1f810 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
1f820 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
1f830 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
1f840 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
1f850 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1f860 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1f870 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
1f880 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
1f890 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
1f8a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f8b0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1f8c0 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
1f8d0 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
1f8e0 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
1f8f0 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
1f900 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1f910 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
1f920 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1f930 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
1f940 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
1f950 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1f960 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
1f970 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1f980 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
1f990 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
1f9a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1f9b0 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
1f9c0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
1f9d0 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
1f9e0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
1f9f0 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
1fa00 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
1fa10 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
1fa20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
1fa30 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
1fa40 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
1fa50 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
1fa60 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
1fa70 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1fa80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1fa90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1faa0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
1fab0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1fac0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1fad0 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
1fae0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1faf0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1fb00 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
1fb10 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
1fb20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1fb30 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
1fb40 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
1fb50 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1fb60 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1fb70 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
1fb80 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
1fb90 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
1fba0 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
1fbb0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1fbc0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1fbd0 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
1fbe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
1fbf0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
1fc00 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
1fc10 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
1fc20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fc30 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1fc40 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1fc50 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1fc60 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1fc70 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
1fc80 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1fc90 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1fca0 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
1fcb0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1fcc0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1fcd0 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
1fce0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1fcf0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
1fd00 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
1fd10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1fd20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fd30 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1fd40 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
1fd50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
1fd60 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
1fd70 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1fd80 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
1fd90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1fda0 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
1fdb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1fdc0 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
1fdd0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1fde0 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
1fdf0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
1fe00 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
1fe10 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ENT./*.** This f
1fe20 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1fe30 64 20 61 73 20 70 61 72 74 20 6f 66 20 6d 65 72  d as part of mer
1fe40 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52 45  ging an CONCURRE
1fe50 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  NT transaction w
1fe60 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73  ith.** the snaps
1fe70 68 6f 74 20 61 74 20 74 68 65 20 68 65 61 64 20  hot at the head 
1fe80 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e  of the wal file.
1fe90 20 49 74 20 72 65 6c 6f 63 61 74 65 73 20 61 6c   It relocates al
1fea0 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a  l pages in the.*
1feb0 2a 20 72 61 6e 67 65 20 69 46 69 72 73 74 2e 2e  * range iFirst..
1fec0 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65  iLast, inclusive
1fed0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
1fee0 74 68 61 74 20 74 68 65 20 42 74 72 65 65 50 74  that the BtreePt
1fef0 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75 63 74 75  rmap .** structu
1ff00 72 65 20 61 74 20 42 74 53 68 61 72 65 64 2e 70  re at BtShared.p
1ff10 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Map contains the
1ff20 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
1ff30 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 61 63   pointers to eac
1ff40 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65  h.** page in the
1ff50 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
1ff60 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 4e 55   pnCurrent is NU
1ff70 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  LL, then all pag
1ff80 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  es in the range 
1ff90 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 63 75 72  are moved to cur
1ffa0 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c  rently.** free l
1ffb0 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66  ocations (i.e. f
1ffc0 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73  ree-list entries
1ffd0 29 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74  ) within the dat
1ffe0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
1fff0 65 20 70 61 67 65 0a 2a 2a 20 69 46 69 72 73 74  e page.** iFirst
20000 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70  ..**.** Or, if p
20010 6e 43 75 72 72 65 6e 74 20 69 73 20 6e 6f 74 20  nCurrent is not 
20020 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f  NULL, then it po
20030 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 75 65 20  ints to a value 
20040 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
20050 2a 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * current size o
20060 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20070 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 6e  ile in pages. In
20080 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20   this case, all 
20090 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c  pages are.** rel
200a0 6f 63 61 74 65 64 20 74 6f 20 74 68 65 20 65 6e  ocated to the en
200b0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
200c0 65 20 66 69 6c 65 20 2d 20 70 61 67 65 20 69 46  e file - page iF
200d0 69 72 73 74 20 69 73 20 72 65 6c 6f 63 61 74 65  irst is relocate
200e0 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70  d to.** page (*p
200f0 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20 70 61 67  nCurrent+1), pag
20100 65 20 69 46 69 72 73 74 2b 31 20 74 6f 20 70 61  e iFirst+1 to pa
20110 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32  ge (*pnCurrent+2
20120 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a  ), and so on..**
20130 20 56 61 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e   Value *pnCurren
20140 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
20150 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
20160 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
20170 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
20180 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
20190 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
201a0 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
201b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
201c0 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
201d0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
201e0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
201f0 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a 20  RelocateRange(. 
20200 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20220 20 2f 2a 20 42 2d 74 72 65 65 20 68 61 6e 64 6c   /* B-tree handl
20230 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72  e */.  Pgno iFir
20240 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
20250 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
20260 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65  page to relocate
20270 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74   */.  Pgno iLast
20280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20290 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
202a0 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a  ge to relocate *
202b0 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72  /.  Pgno *pnCurr
202c0 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ent             
202d0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
202e0 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61  LL, IN/OUT: Data
202f0 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a  base size */.){.
20300 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20310 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74 72  E_OK;.  BtreePtr
20320 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d  map *pMap = pBt-
20330 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50  >pMap;.  Pgno iP
20340 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69 46  g;..  for(iPg=iF
20350 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74  irst; iPg<=iLast
20360 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
20370 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d  K; iPg++){.    M
20380 65 6d 50 61 67 65 20 2a 70 46 72 65 65 20 3d 20  emPage *pFree = 
20390 30 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 61  0;     /* Page a
203a0 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 66 72  llocated from fr
203b0 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d  ee-list */.    M
203c0 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
203d0 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20  .    Pgno iNew; 
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
203f0 4e 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  New page number 
20400 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 20 20 50  for pPg */.    P
20410 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
20420 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ry;    /* Pointe
20430 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
20440 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20  page iPg */..   
20450 20 69 66 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e   if( iPg==PENDIN
20460 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20470 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20480 20 70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d   pEntry = &pMap-
20490 3e 61 50 74 72 5b 69 50 67 20 2d 20 70 4d 61 70  >aPtr[iPg - pMap
204a0 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20  ->iFirst];..    
204b0 69 66 28 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  if( pEntry->eTyp
204c0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
204d0 47 45 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  GE ){.      Pgno
204e0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63   dummy;.      rc
204f0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
20500 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
20510 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42  , &dummy, iPg, B
20520 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
20530 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20540 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 61  (pFree);.      a
20550 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20560 45 5f 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69  E_OK || dummy==i
20570 50 67 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Pg );.    }else 
20580 69 66 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b  if( pnCurrent ){
20590 0a 20 20 20 20 20 20 62 74 72 65 65 47 65 74 50  .      btreeGetP
205a0 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70  age(pBt, iPg, &p
205b0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  Pg, 0);.      as
205c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
205d0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
205e0 67 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  g->pDbPage) );. 
205f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
20600 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
20610 63 6f 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61  count(pPg->pDbPa
20620 67 65 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ge)==1 );.      
20630 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72  iNew = ++(*pnCur
20640 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rent);.      if(
20650 20 69 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42   iNew==PENDING_B
20660 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
20670 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72  iNew = ++(*pnCur
20680 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  rent);.      rc 
20690 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
206a0 42 74 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d  Bt, pPg, pEntry-
206b0 3e 65 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e  >eType, pEntry->
206c0 70 61 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29  parent, iNew, 1)
206d0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
206e0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  ageNotNull(pPg);
206f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20700 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
20710 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
20720 46 72 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69  Free, &iNew, iFi
20730 72 73 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c  rst-1, BTALLOC_L
20740 45 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  E);.      assert
20750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20760 7c 7c 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29  || iNew<iFirst )
20770 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20790 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
207a0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  g = 0;.        r
207b0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
207c0 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  );.        btree
207d0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 67  GetPage(pBt, iPg
207e0 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
207f0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
20800 65 50 61 67 65 28 70 42 74 2c 20 70 50 67 2c 20  ePage(pBt, pPg, 
20810 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20 70  pEntry->eType, p
20820 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c 69 4e  Entry->parent,iN
20830 65 77 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ew,1);.        r
20840 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
20850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20860 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20870 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  }../* !defined(S
20880 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
20890 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68 65  RRENT).**.** The
208a0 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 70   b-tree handle p
208b0 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
208c0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  y argument is ab
208d0 6f 75 74 20 74 6f 20 63 6f 6d 6d 69 74 20 61 6e  out to commit an
208e0 0a 2a 2a 20 43 4f 4e 43 55 52 52 45 4e 54 20 74  .** CONCURRENT t
208f0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20 74  ransaction. At t
20900 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 20  his point it is 
20910 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
20920 74 68 69 73 20 69 73 20 0a 2a 2a 20 70 6f 73 73  this is .** poss
20930 69 62 6c 65 20 2d 20 74 68 65 20 77 61 6c 20 57  ible - the wal W
20940 52 49 54 45 52 20 6c 6f 63 6b 20 69 73 20 68 65  RITER lock is he
20950 6c 64 20 61 6e 64 20 69 74 20 69 73 20 6b 6e 6f  ld and it is kno
20960 77 6e 20 74 68 61 74 20 74 68 65 72 65 20 61 72  wn that there ar
20970 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69 63  e .** no conflic
20980 74 73 20 77 69 74 68 20 63 6f 6d 6d 69 74 74 65  ts with committe
20990 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  d transactions..
209a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
209b0 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 42  reeFixUnlocked(B
209c0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
209d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
209e0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
209f0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
20a00 67 65 31 3b 0a 20 20 75 38 20 2a 70 31 20 3d 20  ge1;.  u8 *p1 = 
20a10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
20a20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
20a30 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
20a40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20a50 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 61 67  OK;..  /* If pag
20a60 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
20a70 61 73 65 20 69 73 20 6e 6f 74 20 77 72 69 74 61  ase is not writa
20a80 62 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 70 61 67  ble, then no pag
20a90 65 73 20 77 65 72 65 20 61 6c 6c 6f 63 61 74 65  es were allocate
20aa0 64 0a 20 20 2a 2a 20 6f 72 20 66 72 65 65 64 20  d.  ** or freed 
20ab0 62 79 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  by this transact
20ac0 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
20ad0 65 20 6e 6f 20 73 70 65 63 69 61 6c 20 68 61 6e  e no special han
20ae0 64 6c 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20 72  dling is .  ** r
20af0 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
20b00 73 65 2c 20 69 66 20 70 61 67 65 20 31 20 69 73  se, if page 1 is
20b10 20 64 69 72 74 79 2c 20 70 72 6f 63 65 65 64 2e   dirty, proceed.
20b20 20 20 2a 2f 0a 20 20 42 74 72 65 65 50 74 72 6d    */.  BtreePtrm
20b30 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
20b40 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 54 72  pMap;.  Pgno iTr
20b50 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
20b60 70 31 5b 33 32 5d 29 3b 0a 20 20 50 67 6e 6f 20  p1[32]);.  Pgno 
20b70 6e 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  nPage = btreePag
20b80 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 75  ecount(pBt);.  u
20b90 33 32 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  32 nFree = get4b
20ba0 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20  yte(&p1[36]);.. 
20bb0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 4d   assert( pBt->pM
20bc0 61 70 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ap );.  rc = sql
20bd0 69 74 65 33 50 61 67 65 72 55 70 67 72 61 64 65  ite3PagerUpgrade
20be0 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72 2c  Snapshot(pPager,
20bf0 20 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65   pPage1->pDbPage
20c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3d  );.  assert( p1=
20c10 3d 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  =pPage1->aData )
20c20 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
20c30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
20c40 6e 6f 20 6e 48 50 61 67 65 20 3d 20 67 65 74 34  no nHPage = get4
20c50 62 79 74 65 28 26 70 31 5b 32 38 5d 29 3b 0a 20  byte(&p1[28]);. 
20c60 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 6e     Pgno nFin = n
20c70 48 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 2f  HPage;         /
20c80 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 61 66 74  * Size of db aft
20c90 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  er transaction m
20ca0 65 72 67 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28  erge */..    if(
20cb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
20cc0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
20cd0 3e 70 44 62 50 61 67 65 29 20 29 7b 0a 20 20 20  >pDbPage) ){.   
20ce0 20 20 20 50 67 6e 6f 20 69 48 54 72 75 6e 6b 20     Pgno iHTrunk 
20cf0 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b 33  = get4byte(&p1[3
20d00 32 5d 29 3b 0a 20 20 20 20 20 20 75 33 32 20 6e  2]);.      u32 n
20d10 48 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  HFree = get4byte
20d20 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 20 20  (&p1[36]);..    
20d30 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
20d40 68 65 61 64 20 64 61 74 61 62 61 73 65 20 66 72  head database fr
20d50 65 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 65  ee list to the e
20d60 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  nd of the curren
20d70 74 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  t.      ** trans
20d80 61 63 74 69 6f 6e 73 20 66 72 65 65 2d 6c 69 73  actions free-lis
20d90 74 20 28 69 66 20 61 6e 79 29 2e 20 20 2a 2f 0a  t (if any).  */.
20da0 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
20db0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
20dc0 75 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 2c  ut4byte(&p1[36],
20dd0 20 6e 48 46 72 65 65 20 2b 20 6e 46 72 65 65 29   nHFree + nFree)
20de0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
20df0 74 65 28 26 70 31 5b 33 32 5d 2c 20 69 54 72 75  te(&p1[32], iTru
20e00 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  nk);.        whi
20e10 6c 65 28 20 69 54 72 75 6e 6b 20 29 7b 0a 20 20  le( iTrunk ){.  
20e20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
20e30 70 54 72 75 6e 6b 20 3d 20 73 71 6c 69 74 65 33  pTrunk = sqlite3
20e40 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
20e50 65 72 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20  er, iTrunk);.   
20e60 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
20e70 67 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 54  get4byte((u8*)pT
20e80 72 75 6e 6b 2d 3e 70 44 61 74 61 29 3b 0a 20 20  runk->pData);.  
20e90 20 20 20 20 20 20 20 20 69 66 28 20 69 54 72 75          if( iTru
20ea0 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nk==0 ){.       
20eb0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 28 75       put4byte((u
20ec0 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61  8*)pTrunk->pData
20ed0 2c 20 69 48 54 72 75 6e 6b 29 3b 0a 20 20 20 20  , iHTrunk);.    
20ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20ef0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
20f00 72 65 66 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20  ref(pTrunk);.   
20f10 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a       };.      }.
20f20 0a 20 20 20 20 20 20 69 66 28 20 6e 48 50 61 67  .      if( nHPag
20f30 65 3c 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d  e<(pMap->iFirst-
20f40 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
20f50 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
20f60 6e 73 69 73 74 65 64 20 6f 66 20 28 70 4d 61 70  nsisted of (pMap
20f70 2d 3e 69 46 69 72 73 74 2d 31 29 20 70 61 67 65  ->iFirst-1) page
20f80 73 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  s when the curre
20f90 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  nt.        ** co
20fa0 6e 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63  ncurrent transac
20fb0 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
20fc0 20 41 6e 64 20 61 6e 20 63 6f 6e 63 75 72 72 65   And an concurre
20fd0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  nt transaction m
20fe0 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  ay.        ** no
20ff0 74 20 62 65 20 65 78 65 63 75 74 65 64 20 6f 6e  t be executed on
21000 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
21010 64 61 74 61 62 61 73 65 20 2d 20 73 6f 20 74 68  database - so th
21020 65 20 64 62 20 73 68 6f 75 6c 64 20 0a 20 20 20  e db should .   
21030 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65       ** not have
21040 20 73 68 72 75 6e 6b 20 73 69 6e 63 65 20 74 68   shrunk since th
21050 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
21060 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 72 65 66  s opened. Theref
21070 6f 72 65 20 6e 48 50 61 67 65 0a 20 20 20 20 20  ore nHPage.     
21080 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
21090 73 65 74 20 74 6f 20 28 70 4d 61 70 2d 3e 69 46  set to (pMap->iF
210a0 69 72 73 74 2d 31 29 20 6f 72 20 67 72 65 61 74  irst-1) or great
210b0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  er. */.        r
210c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
210d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
210e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
210f0 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   The current tra
21100 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  nsaction allocat
21110 65 64 20 70 61 67 65 73 20 70 4d 61 70 2d 3e 69  ed pages pMap->i
21120 46 69 72 73 74 20 74 68 72 6f 75 67 68 0a 20 20  First through.  
21130 20 20 20 20 20 20 2a 2a 20 6e 50 61 67 65 20 28        ** nPage (
21140 69 6e 63 6c 75 73 69 76 65 29 20 61 74 20 74 68  inclusive) at th
21150 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
21160 61 62 61 73 65 20 66 69 6c 65 2e 20 4d 65 61 6e  abase file. Mean
21170 77 68 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a  while,.        *
21180 2a 20 6f 74 68 65 72 20 74 72 61 6e 73 61 63 74  * other transact
21190 69 6f 6e 73 20 68 61 76 65 20 61 6c 6c 6f 63 61  ions have alloca
211a0 74 65 64 20 28 69 46 69 72 73 74 2e 2e 6e 48 50  ted (iFirst..nHP
211b0 61 67 65 29 2e 20 53 6f 20 6d 6f 76 65 0a 20 20  age). So move.  
211c0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 28        ** pages (
211d0 69 46 69 72 73 74 2e 2e 4d 49 4e 28 6e 50 61 67  iFirst..MIN(nPag
211e0 65 2c 6e 48 50 61 67 65 29 29 20 74 6f 20 28 4d  e,nHPage)) to (M
211f0 41 58 28 6e 50 61 67 65 2c 6e 48 50 61 67 65 29  AX(nPage,nHPage)
21200 2b 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  +1).  */.       
21210 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d 20 4d 49   Pgno iLast = MI
21220 4e 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65 29  N(nPage, nHPage)
21230 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67  ;    /* Last pag
21240 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 20  e to move */.   
21250 20 20 20 20 20 50 67 6e 6f 20 6e 43 75 72 72 65       Pgno nCurre
21260 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
21270 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
21280 65 6e 74 20 73 69 7a 65 20 6f 66 20 64 62 20 2a  ent size of db *
21290 2f 0a 20 20 20 20 20 20 20 20 6e 43 75 72 72 65  /.        nCurre
212a0 6e 74 20 3d 20 4d 41 58 28 6e 50 61 67 65 2c 20  nt = MAX(nPage, 
212b0 6e 48 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  nHPage);.       
212c0 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f 63   rc = btreeReloc
212d0 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20 70 4d  ateRange(pBt, pM
212e0 61 70 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61 73  ap->iFirst, iLas
212f0 74 2c 20 26 6e 43 75 72 72 65 6e 74 29 3b 0a 0a  t, &nCurrent);..
21300 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
21310 20 61 72 65 20 6e 6f 77 20 6e 6f 20 63 6f 6c 6c   are now no coll
21320 69 73 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20  isions with the 
21330 73 6e 61 70 73 68 6f 74 20 61 74 20 74 68 65 20  snapshot at the 
21340 68 65 61 64 20 6f 66 20 74 68 65 0a 20 20 20 20  head of the.    
21350 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
21360 66 69 6c 65 2e 20 53 6f 20 61 74 20 74 68 69 73  file. So at this
21370 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
21380 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 77  be possible to w
21390 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  rite.        ** 
213a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
213b0 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 42 65 66  out to disk. Bef
213c0 6f 72 65 20 64 6f 69 6e 67 20 73 6f 20 74 68 6f  ore doing so tho
213d0 75 67 68 2c 20 61 74 74 65 6d 70 74 20 74 6f 0a  ugh, attempt to.
213e0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6c 6f 63          ** reloc
213f0 61 74 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ate some of the 
21400 6e 65 77 20 70 61 67 65 73 20 74 6f 20 66 72 65  new pages to fre
21410 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68  e locations with
21420 69 6e 20 74 68 65 20 62 6f 64 79 0a 20 20 20 20  in the body.    
21430 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61      ** of the da
21440 74 61 62 61 73 65 20 66 69 6c 65 20 28 69 2e 65  tabase file (i.e
21450 2e 20 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72  . free-list entr
21460 69 65 73 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ies). */.       
21470 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21480 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21490 61 73 73 65 72 74 28 20 6e 43 75 72 72 65 6e 74  assert( nCurrent
214a0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
214b0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
214c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
214d0 65 72 53 65 74 44 62 73 69 7a 65 28 70 42 74 2d  erSetDbsize(pBt-
214e0 3e 70 50 61 67 65 72 2c 20 6e 43 75 72 72 65 6e  >pPager, nCurren
214f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 46  t);.          nF
21500 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
21510 70 31 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20 20  p1[36]);.       
21520 20 20 20 6e 46 69 6e 20 3d 20 4d 41 58 28 6e 43     nFin = MAX(nC
21530 75 72 72 65 6e 74 2d 6e 46 72 65 65 2c 20 6e 48  urrent-nFree, nH
21540 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
21550 20 69 66 28 20 6e 43 75 72 72 65 6e 74 3e 50 45   if( nCurrent>PE
21560 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
21570 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45  pBt) && nFin<=PE
21580 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
21590 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
215a0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
215b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
215c0 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f    rc = btreeRelo
215d0 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20 6e  cateRange(pBt, n
215e0 46 69 6e 2b 31 2c 20 6e 43 75 72 72 65 6e 74 2c  Fin+1, nCurrent,
215f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   0);.        }..
21600 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
21610 28 26 70 31 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  (&p1[28], nFin);
21620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21630 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
21640 65 74 44 62 73 69 7a 65 28 70 50 61 67 65 72 2c  etDbsize(pPager,
21650 20 6e 46 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72   nFin);.  }..  r
21660 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
21670 65 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65  e.# define btree
21680 46 69 78 55 6e 6c 6f 63 6b 65 64 28 58 29 20 20  FixUnlocked(X)  
21690 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
216a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
216b0 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f  CONCURRENT */../
216c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
216d0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
216e0 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
216f0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
21700 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
21710 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
21720 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
21730 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
21740 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
21750 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
21760 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
21770 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
21780 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
21790 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
217a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
217b0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
217c0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
217d0 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
217e0 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
217f0 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
21800 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
21810 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
21820 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
21830 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
21840 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
21850 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
21860 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
21870 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
21880 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
21890 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
218a0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
218b0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
218c0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
218d0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
218e0 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
218f0 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
21900 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
21910 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
21920 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
21930 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
21940 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
21950 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
21960 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
21970 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
21980 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
21990 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
219a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
219b0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
219c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
219d0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
219e0 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
219f0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
21a00 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
21a10 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
21a20 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
21a30 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
21a40 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
21a50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
21a60 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
21a70 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
21a80 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
21a90 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
21aa0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
21ab0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
21ac0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
21ad0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
21ae0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
21af0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
21b00 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
21b10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
21b20 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
21b30 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
21b40 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
21b50 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
21b60 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
21b70 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
21b80 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
21b90 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
21ba0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
21bb0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
21bc0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
21bd0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
21be0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
21bf0 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
21c00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
21c10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21c20 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
21c30 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
21c40 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
21c50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21c60 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
21c70 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
21c80 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
21c90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21ca0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
21cb0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 23 69  reeEnter(p);..#i
21cc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21cd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
21ce0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
21cf0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 61 73  cuum ){.      as
21d00 73 65 72 74 28 20 49 53 43 4f 4e 43 55 52 52 45  sert( ISCONCURRE
21d10 4e 54 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  NT==0 );.      r
21d20 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
21d30 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
21d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21d50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
21d60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
21d70 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
21d80 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
21d90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
21da0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
21db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
21dc0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
21dd0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
21de0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
21df0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
21e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21e10 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 7b   ISCONCURRENT ){
21e20 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
21e30 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 70 29 3b  eFixUnlocked(p);
21e40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
21e50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21e60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21e70 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
21e80 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
21e90 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
21ea0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21eb0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
21ec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
21ee0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
21ef0 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
21f00 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
21f10 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
21f20 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
21f30 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
21f40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
21f50 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
21f60 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
21f70 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
21f80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21f90 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
21fa0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
21fb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
21fc0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
21fd0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
21fe0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21ff0 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
22000 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
22010 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
22020 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
22030 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
22040 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
22050 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
22060 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
22070 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
22080 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
22090 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
220a0 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
220b0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
220c0 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
220d0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
220e0 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
220f0 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
22100 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
22110 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
22120 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
22130 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
22140 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
22150 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
22160 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
22170 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
22180 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
22190 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
221a0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
221b0 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
221c0 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
221d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
221e0 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
221f0 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
22200 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
22210 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
22220 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
22230 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
22240 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
22250 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
22260 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
22270 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
22280 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
22290 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
222a0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
222b0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
222c0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
222d0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
222e0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
222f0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
22300 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
22310 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
22320 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
22330 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
22340 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
22350 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
22360 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
22370 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
22380 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
22390 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
223a0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
223b0 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
223c0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
223d0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
223e0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
223f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
22400 20 77 61 73 20 61 6e 20 43 4f 4e 43 55 52 52 45   was an CONCURRE
22410 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  NT transaction, 
22420 64 65 6c 65 74 65 20 74 68 65 20 70 42 74 2d 3e  delete the pBt->
22430 70 4d 61 70 20 6f 62 6a 65 63 74 2e 0a 20 20 2a  pMap object..  *
22440 2a 20 41 6c 73 6f 20 63 61 6c 6c 20 50 61 67 65  * Also call Page
22450 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 29  rEndConcurrent()
22460 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
22470 74 68 65 20 70 61 67 65 72 20 68 61 73 20 64 69  the pager has di
22480 73 63 61 72 64 65 64 0a 20 20 2a 2a 20 74 68 65  scarded.  ** the
22490 20 72 65 63 6f 72 64 20 6f 66 20 61 6c 6c 20 70   record of all p
224a0 61 67 65 73 20 72 65 61 64 20 77 69 74 68 69 6e  ages read within
224b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
224c0 2e 20 20 2a 2f 0a 20 20 62 74 72 65 65 50 74 72  .  */.  btreePtr
224d0 6d 61 70 44 65 6c 65 74 65 28 70 42 74 29 3b 0a  mapDelete(pBt);.
224e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e    sqlite3PagerEn
224f0 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d  dConcurrent(pBt-
22500 3e 70 50 61 67 65 72 29 3b 0a 20 20 62 74 72 65  >pPager);.  btre
22510 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
22520 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
22530 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
22540 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
22550 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
22560 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
22570 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
22580 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
22590 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
225a0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
225b0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
225c0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
225d0 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
225e0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
225f0 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
22600 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
22610 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
22620 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
22630 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
22640 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
22650 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
22660 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
22670 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
22680 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
22690 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
226a0 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
226b0 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
226c0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
226d0 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
226e0 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
226f0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
22700 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
22710 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
22720 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
22730 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
22740 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
22750 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
22760 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
22770 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
22780 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
22790 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
227a0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
227b0 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
227c0 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
227d0 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
227e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
227f0 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
22800 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
22810 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
22820 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
22830 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
22840 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
22850 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
22860 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
22870 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
22880 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
22890 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
228a0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
228b0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
228c0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
228d0 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
228e0 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
228f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
22900 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
22910 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
22920 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
22930 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
22940 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
22950 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
22960 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
22970 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
22980 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
22990 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
229a0 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
229b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
229c0 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
229d0 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
229e0 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
229f0 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
22a00 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
22a10 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
22a20 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
22a30 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
22a40 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
22a50 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
22a60 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
22a70 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
22a80 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
22a90 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
22aa0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22ab0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
22ac0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
22ad0 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
22ae0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
22af0 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
22b00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
22b10 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22b20 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
22b30 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
22b40 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
22b50 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
22b60 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
22b70 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
22b80 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
22b90 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
22ba0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
22bb0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
22bc0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
22bd0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
22be0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
22bf0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
22c00 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
22c10 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
22c20 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
22c30 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
22c40 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
22c50 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
22c60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22c70 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
22c80 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
22c90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22ca0 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
22cb0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
22cc0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
22cd0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
22ce0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
22cf0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
22d00 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
22d10 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
22d20 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
22d30 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
22d40 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
22d50 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
22d60 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
22d70 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
22d80 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
22d90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
22da0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
22db0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22dc0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
22dd0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
22de0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
22df0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
22e00 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
22e10 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
22e20 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
22e30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
22e40 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
22e50 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
22e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
22e70 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22e80 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
22e90 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
22ea0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
22eb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22ec0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
22ed0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
22ee0 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
22ef0 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
22f00 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
22f10 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
22f20 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
22f30 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
22f40 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
22f50 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
22f60 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
22f70 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
22f80 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
22f90 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
22fa0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
22fb0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
22fc0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
22fd0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
22fe0 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
22ff0 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
23000 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
23010 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
23020 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
23030 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
23040 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
23050 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
23060 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23070 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
23080 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
23090 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
230a0 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
230b0 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
230c0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
230d0 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
230e0 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
230f0 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
23100 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
23110 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
23120 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
23130 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
23140 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
23150 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
23160 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
23170 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
23180 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
23190 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
231a0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
231b0 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
231c0 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
231d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
231e0 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
231f0 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
23200 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
23210 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
23220 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
23230 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
23240 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
23250 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
23260 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
23270 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
23280 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
23290 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
232a0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
232b0 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
232c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
232d0 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
232e0 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
232f0 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
23300 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
23310 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
23320 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
23330 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
23340 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
23350 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
23360 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
23370 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
23380 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
23390 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
233a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
233b0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
233c0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
233d0 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
233e0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
233f0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
23400 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23410 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
23420 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
23430 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
23440 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
23450 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
23460 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
23470 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
23480 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
23490 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
234a0 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
234b0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
234c0 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
234d0 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
234e0 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
234f0 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
23500 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
23510 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23520 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
23530 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
23540 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
23550 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
23560 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
23570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23580 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23590 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
235a0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
235b0 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20  ors(pBtree, rc, 
235c0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
235d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
235e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
235f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23600 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
23610 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
23620 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
23630 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
23640 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e          p->skipN
23650 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
23660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
23670 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
23680 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
23690 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
236a0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
236b0 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
236c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
236d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
236e0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
236f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23700 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
23710 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
23720 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
23730 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
23740 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
23750 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
23760 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
23770 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
23780 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
23790 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
237a0 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
237b0 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
237c0 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
237d0 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
237e0 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
237f0 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
23800 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
23810 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
23820 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
23830 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
23840 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
23850 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
23860 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
23870 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
23880 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
23890 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
238a0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
238b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
238c0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
238d0 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
238e0 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
238f0 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
23900 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
23910 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
23920 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
23930 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
23940 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
23950 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23960 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
23970 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
23980 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
23990 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
239a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
239b0 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
239c0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
239d0 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
239e0 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
239f0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
23a00 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
23a10 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
23a20 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
23a30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
23a40 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
23a50 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
23a60 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
23a70 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
23a80 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
23a90 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
23aa0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
23ab0 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
23ac0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
23ad0 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
23ae0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
23af0 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
23b00 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
23b10 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
23b20 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
23b30 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
23b40 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
23b50 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
23b60 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
23b70 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
23b80 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
23b90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
23ba0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
23bb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
23bc0 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
23bd0 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
23be0 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
23bf0 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
23c00 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
23c10 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
23c20 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
23c30 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
23c40 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
23c50 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
23c60 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
23c70 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
23c80 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
23c90 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
23ca0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
23cb0 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
23cc0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
23cd0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
23ce0 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
23cf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
23d00 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
23d10 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
23d20 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
23d30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
23d40 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
23d50 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
23d60 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
23d70 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
23d80 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
23d90 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23da0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
23db0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
23dc0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
23dd0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
23de0 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
23df0 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
23e00 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
23e10 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
23e20 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
23e30 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
23e40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23e50 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
23e60 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
23e70 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
23e80 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
23e90 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
23ea0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
23eb0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
23ec0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
23ed0 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
23ee0 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
23ef0 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
23f00 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
23f10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
23f20 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
23f30 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
23f40 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
23f50 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
23f60 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
23f70 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
23f80 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
23f90 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
23fa0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
23fb0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
23fc0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
23fd0 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
23fe0 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
23ff0 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
24000 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
24010 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
24020 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
24030 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
24040 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
24050 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
24060 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
24070 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
24080 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
24090 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
240a0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
240b0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
240c0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
240d0 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
240e0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
240f0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
24100 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
24110 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
24120 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
24130 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
24140 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
24150 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
24160 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
24170 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
24180 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
24190 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
241a0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
241b0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
241c0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
241d0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
241e0 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
241f0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
24200 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
24210 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
24220 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
24230 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24240 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
24250 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
24260 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
24270 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
24280 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
24290 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
242a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
242b0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
242c0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
242d0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
242e0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
242f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
24300 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
24310 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
24320 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
24330 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
24340 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
24350 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
24360 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
24370 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
24380 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
24390 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
243a0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
243b0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
243c0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
243d0 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
243e0 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
243f0 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
24400 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
24410 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
24420 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
24430 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
24440 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
24450 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
24460 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
24470 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
24480 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
24490 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
244a0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
244b0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
244c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
244d0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
244e0 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70  reePtrmapBegin(p
244f0 42 74 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  Bt, iStatement);
24500 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
24510 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
24520 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24530 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
24540 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
24550 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
24560 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
24570 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
24580 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
24590 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
245a0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
245b0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
245c0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
245d0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
245e0 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
245f0 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
24600 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
24610 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
24620 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
24630 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
24640 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
24650 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
24660 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
24670 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
24680 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
24690 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
246a0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
246b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
246c0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
246d0 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
246e0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
246f0 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
24700 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
24710 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
24720 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
24730 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
24740 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
24750 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
24760 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
24770 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
24780 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
24790 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
247a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
247b0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
247c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
247d0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
247e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
247f0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
24800 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
24810 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
24820 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
24830 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
24840 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
24850 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
24860 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
24870 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
24880 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
24890 74 65 72 28 70 29 3b 0a 20 20 20 20 62 74 72 65  ter(p);.    btre
248a0 65 50 74 72 6d 61 70 45 6e 64 28 70 42 74 2c 20  ePtrmapEnd(pBt, 
248b0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
248c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
248d0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
248e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
248f0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
24900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
24920 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
24930 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
24940 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
24950 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
24960 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
24970 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
24980 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
24990 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
249a0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
249b0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
249c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
249d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
249e0 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
249f0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
24a00 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
24a10 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
24a20 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
24a30 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
24a40 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
24a50 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
24a60 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
24a70 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
24a80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
24a90 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
24aa0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
24ab0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
24ac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24ad0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
24ae0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
24af0 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
24b00 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
24b10 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
24b20 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
24b30 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
24b40 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
24b50 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
24b60 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
24b70 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
24b80 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
24b90 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
24ba0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
24bb0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
24bc0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
24bd0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
24be0 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
24bf0 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
24c00 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
24c10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
24c20 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
24c30 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
24c40 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
24c50 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
24c60 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
24c70 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
24c80 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
24c90 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
24ca0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
24cb0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
24cc0 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
24cd0 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
24ce0 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
24cf0 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
24d00 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
24d10 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
24d20 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
24d30 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
24d40 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
24d50 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
24d60 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
24d70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
24d80 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
24d90 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
24da0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
24db0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
24dc0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
24dd0 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
24de0 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
24df0 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
24e00 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
24e10 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
24e20 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
24e30 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
24e40 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
24e50 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
24e60 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
24e70 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
24e80 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
24e90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
24ea0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
24eb0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
24ec0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
24ed0 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
24ee0 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
24ef0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
24f00 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
24f10 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
24f20 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
24f30 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
24f40 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
24f50 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
24f60 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
24f70 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
24f80 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
24f90 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
24fa0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
24fb0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
24fc0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
24fd0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
24fe0 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
24ff0 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
25000 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
25010 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
25020 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
25030 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
25040 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
25050 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
25060 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25090 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
250a0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
250b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250c0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
250d0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
250e0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
25110 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
25120 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
25130 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
25140 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
25150 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
25160 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
25170 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
25180 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251a0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
251b0 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
251c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
251d0 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
251e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
251f0 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
25200 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
25210 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25230 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
25240 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
25250 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
25260 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
25270 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
25280 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
25290 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a  | wrFlag==1 );..
252a0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
252b0 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
252c0 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
252d0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
252e0 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
252f0 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
25300 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
25310 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
25320 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
25330 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
25340 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
25350 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
25360 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
25370 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
25380 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
25390 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
253a0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
253b0 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
253c0 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c  KeyInfo!=0, wrFl
253d0 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ag+1) );.  asser
253e0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
253f0 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
25400 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
25410 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
25420 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
25430 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
25440 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
25450 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
25460 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
25470 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
25480 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
25490 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
254a0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
254b0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
254c0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
254d0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
254e0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
254f0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
25500 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
25510 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46  =0 );..  if( wrF
25520 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63  lag ){.    alloc
25530 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
25540 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
25550 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72  pTmpSpace==0 ) r
25560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
25570 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  EM;.  }.  if( iT
25580 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
25590 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
255a0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
255b0 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
255c0 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
255d0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
255e0 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
255f0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
25600 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
25610 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
25620 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
25630 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
25640 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
25650 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
25660 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
25670 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
25680 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
25690 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
256a0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
256b0 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
256c0 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
256d0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  t;.  assert( wrF
256e0 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
256f0 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  ==BTCF_WriteFlag
25700 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   );.  pCur->curF
25710 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20  lags = wrFlag;. 
25720 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
25730 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20  lags = wrFlag ? 
25740 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 : PAGER_GET_RE
25750 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20  ADONLY;.  /* If 
25760 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
25770 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
25780 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
25790 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20   then all such. 
257a0 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73   ** cursors *mus
257b0 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43 46  t* have the BTCF
257c0 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
257d0 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d  et. */.  for(pX=
257e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58  pBt->pCursor; pX
257f0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
25800 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e  .    if( pX->pgn
25810 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61  oRoot==(Pgno)iTa
25820 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d  ble ){.      pX-
25830 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
25840 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20  F_Multiple;.    
25850 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
25860 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c   |= BTCF_Multipl
25870 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  e;.    }.  }.  p
25880 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
25890 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74  ->pCursor;.  pBt
258a0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
258b0 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
258c0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
258d0 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  D;.  return SQLI
258e0 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
258f0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
25900 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25930 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
25940 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25970 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
25980 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
25990 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
259a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
259c0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
259d0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
259e0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
259f0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
25a00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
25a10 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
25a20 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
25a30 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a50 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
25a60 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
25a70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
25a80 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20  f( iTable<1 ){. 
25a90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
25aa0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
25ab0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
25ac0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
25ad0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75      rc = btreeCu
25ae0 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
25af0 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
25b00 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c  , pCur);.    sql
25b10 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
25b20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
25b30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
25b40 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
25b50 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
25b60 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
25b70 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
25b80 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
25b90 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
25ba0 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
25bb0 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
25bc0 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
25bd0 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
25be0 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
25bf0 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
25c00 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
25c10 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
25c20 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
25c30 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
25c40 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
25c50 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
25c60 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
25c70 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
25c80 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
25c90 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
25ca0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
25cb0 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
25cc0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
25cd0 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
25ce0 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
25cf0 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
25d00 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
25d10 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
25d20 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
25d30 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
25d40 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
25d50 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
25d60 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
25d70 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
25d80 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
25d90 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
25da0 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
25db0 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
25dc0 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
25dd0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
25de0 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
25df0 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
25e00 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
25e10 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
25e20 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
25e30 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
25e40 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
25e50 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
25e60 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
25e70 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
25e80 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
25e90 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
25ea0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
25eb0 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
25ec0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
25ed0 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
25ee0 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
25ef0 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
25f00 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
25f10 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
25f20 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
25f30 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
25f40 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
25f50 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
25f60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
25f70 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
25f80 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ur);.    assert(
25f90 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30   pBt->pCursor!=0
25fa0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   );.    if( pBt-
25fb0 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29  >pCursor==pCur )
25fc0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
25fd0 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
25fe0 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
25ff0 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70       BtCursor *p
26000 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72  Prev = pBt->pCur
26010 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  sor;.      do{. 
26020 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76         if( pPrev
26030 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b  ->pNext==pCur ){
26040 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76  .          pPrev
26050 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
26060 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
26070 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26080 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20  }.        pPrev 
26090 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a  = pPrev->pNext;.
260a0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c        }while( AL
260b0 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20  WAYS(pPrev) );. 
260c0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
260d0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
260e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
260f0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
26100 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
26110 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
26120 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
26130 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26140 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
26150 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
26160 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
26170 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
26180 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
26190 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
261a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
261b0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
261c0 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
261d0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
261e0 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
261f0 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
26200 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
26210 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
26220 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
26230 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
26240 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
26250 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
26260 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
26270 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
26280 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
26290 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
262a0 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
262b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
262c0 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
262d0 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64  Cell()..*/.#ifnd
262e0 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
262f0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
26300 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
26310 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
26320 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
26330 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
26340 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
26350 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
26360 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
26370 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
26380 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
26390 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
263a0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
263b0 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
263c0 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70  UPT_DB || memcmp
263d0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
263e0 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
263f0 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
26400 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
26410 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
26420 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c  endif.static SQL
26430 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
26440 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
26450 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
26460 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
26470 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
26480 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
26490 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75  ->iPage;.    pCu
264a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
264b0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
264c0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
264d0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
264e0 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
264f0 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
26500 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  info);.  }else{.
26510 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
26520 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  fo(pCur);.  }.}.
26530 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
26540 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
26550 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
26560 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
26570 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
26580 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
26590 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
265a0 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
265b0 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
265c0 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
265d0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
265e0 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
265f0 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
26600 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
26610 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
26620 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
26630 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
26640 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
26650 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
26660 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
26670 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26680 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
26690 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
266a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
266b0 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
266c0 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  G */../*.** Set 
266d0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
266e0 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
266f0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
26700 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
26710 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
26720 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
26730 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
26740 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
26750 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
26760 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
26770 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
26780 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
26790 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
267a0 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
267b0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
267c0 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
267d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
267e0 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
267f0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
26800 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74   must position t
26810 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
26820 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
26830 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
26840 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
26850 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61  nnot fail.  It a
26860 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
26870 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e  LITE_OK.  .*/.in
26880 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
26890 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
268a0 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
268b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
268c0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
268d0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
268e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
268f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
26900 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
26910 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70  r);.  *pSize = p
26920 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
26930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26940 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
26950 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
26960 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
26970 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
26980 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
26990 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
269a0 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ts to..**.** The
269b0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
269c0 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
269d0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
269e0 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
269f0 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
26a00 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
26a10 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
26a20 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
26a30 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
26a40 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
26a50 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
26a60 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
26a70 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
26a80 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20  possible.  This 
26a90 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
26aa0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
26ab0 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a  K..** It might j
26ac0 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61  ust as well be a
26ad0 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75   procedure (retu
26ae0 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20  rning void) but 
26af0 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74  we continue.** t
26b00 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  o return an inte
26b10 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ger result code 
26b20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
26b30 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  easons..*/.int s
26b40 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
26b50 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
26b60 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
26b70 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26b80 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26b90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
26ba0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26bb0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26bc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
26bd0 67 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge>=0 );.  asser
26be0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
26bf0 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
26c00 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  H );.  assert( p
26c10 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26c20 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79  ->iPage]->intKey
26c30 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74  Leaf==1 );.  get
26c40 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
26c50 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
26c60 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a  >info.nPayload;.
26c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26c80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  OK;.}../*.** Giv
26c90 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
26ca0 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
26cb0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
26cc0 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
26cd0 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
26ce0 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
26cf0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
26d00 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
26d10 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
26d20 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
26d30 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
26d40 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
26d50 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
26d60 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
26d70 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
26d80 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
26d90 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
26da0 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
26db0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26dc0 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
26dd0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
26de0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
26df0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
26e00 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
26e10 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
26e20 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
26e30 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
26e40 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
26e50 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
26e60 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
26e70 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
26e80 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
26e90 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
26ea0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
26eb0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
26ec0 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
26ed0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
26ee0 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
26ef0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
26f00 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
26f10 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
26f20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
26f30 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
26f40 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
26f50 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
26f60 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
26f70 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
26f80 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
26f90 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
26fa0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
26fb0 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
26fc0 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
26fd0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
26fe0 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
26ff0 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
27000 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
27010 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
27020 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
27030 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
27040 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
27050 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
27060 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
27070 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
27080 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
27090 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
270a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
270b0 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
270c0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
270d0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
270e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
270f0 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
27100 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
27110 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
27120 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
27130 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
27140 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
27150 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
27160 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
27170 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
27180 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
27190 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
271a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
271b0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
271c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
271d0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
271e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
271f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
27200 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
27210 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
27220 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
27230 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
27240 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
27250 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
27260 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
27270 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
27280 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
27290 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
272a0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
272b0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
272c0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
272d0 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
272e0 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
272f0 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
27300 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
27310 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
27320 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
27330 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
27340 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
27350 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
27360 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
27370 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
27380 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
27390 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
273a0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
273b0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
273c0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
273d0 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
273e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
273f0 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
27400 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
27410 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
27420 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
27430 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
27440 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
27450 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
27460 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
27470 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
27480 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
27490 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
274a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
274b0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
274c0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
274d0 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
274e0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
274f0 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
27500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27510 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
27520 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
27530 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
27540 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
27550 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
27560 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
27570 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
27580 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
27590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
275a0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
275b0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
275c0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
275d0 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
275e0 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
275f0 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
27600 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
27610 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
27620 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
27630 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
27640 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
27650 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
27660 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
27670 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
27680 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
27690 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
276a0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
276b0 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
276c0 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
276d0 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
276e0 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
276f0 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
27700 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
27710 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
27720 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
27730 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
27740 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
27750 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
27760 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
27770 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
27780 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
27790 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
277a0 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
277b0 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
277c0 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
277d0 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
277e0 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
277f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
27800 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
27810 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
27820 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
27830 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
27840 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
27850 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
27860 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
27870 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
27880 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
27890 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
278a0 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
278b0 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
278c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
278d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
278e0 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
278f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
27900 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
27910 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
27920 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
27930 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
27940 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
27950 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
27960 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
27970 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
27980 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
27990 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
279a0 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
279b0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
279c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
279d0 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
279e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
279f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27a00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
27a10 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
27a20 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
27a30 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
27a40 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
27a50 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
27a60 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
27a70 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
27a80 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
27a90 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
27aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27ab0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
27ac0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
27ad0 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
27ae0 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
27af0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
27b00 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
27b10 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
27b20 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
27b30 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
27b40 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
27b50 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
27b60 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
27b70 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
27b80 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
27b90 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
27ba0 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
27bb0 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
27bc0 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
27bd0 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
27be0 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72  **   2: The oper
27bf0 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
27c00 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65   Do not populate
27c10 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
27c20 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
27c30 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
27c40 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
27c50 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
27c60 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
27c70 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
27c80 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
27c90 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
27ca0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
27cb0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
27cc0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
27cd0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
27ce0 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
27cf0 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
27d00 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
27d10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
27d20 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
27d30 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
27d40 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
27d50 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65  ges and the.** e
27d60 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  Op argument is n
27d70 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74  ot 2, this funct
27d80 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65  ion may allocate
27d90 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
27da0 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61  azily .** popula
27db0 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
27dc0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27dd0 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
27de0 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
27df0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
27e00 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
27e10 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
27e20 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
27e30 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
27e40 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
27e50 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
27e60 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
27e70 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
27e80 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
27e90 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
27ea0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
27eb0 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
27ec0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
27ed0 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
27ee0 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
27ef0 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
27f00 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
27f10 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
27f20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
27f30 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
27f40 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
27f50 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
27f60 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
27f70 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
27f80 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
27f90 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
27fa0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
27fb0 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
27fc0 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
27fd0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
27fe0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
27ff0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
28000 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
28010 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
28020 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
28030 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
28040 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
28050 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
28060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
28070 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
28080 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
28090 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
280a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
280b0 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
280c0 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
280d0 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
280e0 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
280f0 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
28100 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
28110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
28120 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
28130 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
28140 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
28150 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
28160 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28170 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
28180 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
28190 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
281a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
281b0 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
281c0 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
281d0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
281e0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
281f0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
28200 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
28210 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
28220 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
28230 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
28240 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
28250 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
28260 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
28270 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b  Buf;.  int bEnd;
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282a0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
282b0 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61  ing to end of da
282c0 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ta */.#endif..  
282d0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
282e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
282f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28300 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
28310 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
28320 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
28330 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
28340 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
28350 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
28360 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32    assert( eOp!=2
28370 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b   || offset==0 );
28380 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74      /* Always st
28390 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69  art from beginni
283a0 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f  ng for eOp==2 */
283b0 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
283c0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
283d0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
283e0 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20  Payload;.#ifdef 
283f0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
28400 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45  ERFLOW_READ.  bE
28410 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d  nd = offset+amt=
28420 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  =pCur->info.nPay
28430 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61  load;.#endif.  a
28440 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
28450 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
28460 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69  nPayload );..  i
28470 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  f( &aPayload[pCu
28480 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
28490 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
284a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
284b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
284c0 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
284d0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
284e0 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
284f0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
28500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28510 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
28520 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
28530 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
28540 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
28550 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
28560 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
28570 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
28580 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
28590 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
285a0 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
285b0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
285c0 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
285d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
285e0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
285f0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
28600 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
28610 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
28620 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50  (eOp & 0x01), pP
28630 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
28640 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
28650 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
28660 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
28670 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
28680 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
28690 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66  ocal;.  }...  if
286a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
286b0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
286c0 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
286d0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
286e0 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
286f0 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
28700 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
28710 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
28720 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
28730 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
28740 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
28750 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
28760 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
28770 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
28780 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
28790 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
287a0 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  now..    ** Exce
287b0 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63  pt, do not alloc
287c0 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  ate aOverflow[] 
287d0 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20  for eOp==2..    
287e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
287f0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
28800 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
28810 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
28820 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
28830 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
28840 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
28850 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
28860 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
28870 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
28880 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
28890 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
288a0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
288b0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
288c0 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
288d0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
288e0 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
288f0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
28900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28910 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d  eOp!=2 && (pCur-
28920 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
28930 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
28940 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
28950 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
28960 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
28970 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
28980 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
28990 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
289a0 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f  >pCur->nOvflAllo
289b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  c ){.        Pgn
289c0 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a  o *aNew = (Pgno*
289d0 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28  )sqlite3Realloc(
289e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
289f0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f  r->aOverflow, nO
28a00 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e  vfl*2*sizeof(Pgn
28a10 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
28a20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
28a30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
28a40 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
28a50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
28a60 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
28a70 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f  >nOvflAlloc = nO
28a80 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20  vfl*2;.         
28a90 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
28aa0 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
28ab0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
28ac0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28ad0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  OK ){.        me
28ae0 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72  mset(pCur->aOver
28af0 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73  flow, 0, nOvfl*s
28b00 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20  izeof(Pgno));.  
28b10 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
28b20 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
28b30 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a  idOvfl;.      }.
28b40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
28b50 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
28b60 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
28b70 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
28b80 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
28b90 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
28ba0 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
28bb0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
28bc0 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
28bd0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
28be0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28bf0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
28c00 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
28c10 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75  )!=0.     && pCu
28c20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
28c30 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20  set/ovflSize].  
28c40 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20    ){.      iIdx 
28c50 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
28c60 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
28c70 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
28c80 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
28c90 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
28ca0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
28cb0 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b     }..    for( ;
28cc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28cd0 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
28ce0 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20  age; iIdx++){.. 
28cf0 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
28d00 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
28d10 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
28d20 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
28d30 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
28d40 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
28d50 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b  ValidOvfl)!=0 ){
28d60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28d70 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
28d80 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
28d90 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
28da0 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
28db0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
28dc0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
28dd0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
28de0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
28df0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
28e00 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
28e10 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
28e20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
28e30 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
28e40 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
28e50 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
28e60 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
28e70 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
28e80 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
28e90 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
28ea0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
28eb0 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
28ec0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
28ed0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
28ee0 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
28ef0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
28f00 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
28f10 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
28f20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
28f30 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28f40 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
28f50 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
28f60 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
28f70 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
28f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
28f90 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
28fa0 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
28fb0 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
28fc0 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
28fd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28fe0 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
28ff0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
29000 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
29010 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
29020 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
29030 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
29040 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
29050 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
29060 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
29070 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
29080 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
29090 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
290a0 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
290b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
290c0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
290d0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
290e0 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
290f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29100 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
29110 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
29120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
29130 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
29140 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
29150 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
29160 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
29170 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
29180 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
29190 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
291a0 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
291b0 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
291c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
291d0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
291e0 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
291f0 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64  3_file *fd;.#end
29200 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  if.        int a
29210 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
29220 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
29230 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
29240 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
29250 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
29260 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
29270 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
29280 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
29290 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
292a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
292b0 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
292c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
292d0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
292e0 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
292f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
29300 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
29310 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
29320 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
29330 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
29340 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64     **   3) the d
29350 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
29360 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
29370 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72      **   4) ther
29380 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69  e is no open wri
29390 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
293a0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
293b0 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65   5) the database
293c0 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61   is not a WAL da
293d0 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20  tabase,.        
293e0 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61  **   6) all data
293f0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
29400 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20  s being read..  
29410 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74        **   7) at
29420 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
29430 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
29440 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
29450 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
29460 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29470 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
29480 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
29490 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
294a0 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
294b0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
294c0 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
294d0 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
294e0 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
294f0 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
29500 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
29510 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
29520 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
29530 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
29540 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29550 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30      if( (eOp&0x0
29560 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  1)==0           
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
29590 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
295a0 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295d0 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
295e0 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20         && (bEnd 
295f0 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20  || a==ovflSize) 
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29620 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
29630 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
29640 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
29650 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
29660 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
29670 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
29680 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
29690 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
296a0 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
296b0 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
296c0 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31    && pBt->pPage1
296d0 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30  ->aData[19]==0x0
296e0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
296f0 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
29700 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
29710 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
29720 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29740 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20   /* (7) */.     
29750 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
29760 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
29770 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
29780 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
29790 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
297a0 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
297b0 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
297d0 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20   hence (7) */.  
297e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
297f0 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
29800 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
29810 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
29820 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
29830 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
29840 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
29850 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
29860 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
29870 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
29880 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
29890 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
298a0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
298b0 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
298c0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
298d0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
298e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
298f0 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
29900 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
29910 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
29920 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26            ((eOp&
29930 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52  0x01)==0 ? PAGER
29940 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
29950 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
29960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29980 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
29990 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
299a0 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
299b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
299c0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
299d0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
299e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
299f0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
29a00 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
29a10 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30   pBuf, a, (eOp&0
29a20 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a  x01), pDbPage);.
29a30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
29a40 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
29a50 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29a60 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
29a70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29a80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
29a90 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
29aa0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
29ab0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
29ac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29ad0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
29ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29af0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29b00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29b10 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
29b20 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
29b30 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
29b40 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
29b50 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
29b60 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
29b70 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
29b80 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
29b90 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
29ba0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
29bb0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
29bc0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
29bd0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
29be0 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
29bf0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
29c00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
29c10 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
29c20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
29c30 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
29c40 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
29c50 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
29c60 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
29c70 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
29c80 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
29c90 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
29ca0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
29cb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
29cc0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
29cd0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
29ce0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29cf0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
29d00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
29d10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29d20 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
29d30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
29d40 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
29d50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29d60 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
29d70 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29d80 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
29d90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29da0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
29db0 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
29dc0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
29dd0 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
29de0 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
29df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
29e00 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
29e10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
29e20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
29e30 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
29e40 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
29e50 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
29e60 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
29e70 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
29e80 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
29e90 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
29ea0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
29eb0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
29ec0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
29ed0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
29ee0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
29ef0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
29f00 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
29f10 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
29f20 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
29f30 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
29f40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
29f50 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
29f60 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
29f70 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
29f80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29f90 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
29fa0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29fb0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
29fc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29fd0 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
29fe0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
29ff0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2a000 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
2a010 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2a020 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
2a030 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a040 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2a050 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a060 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2a070 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a080 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
2a090 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a0a0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
2a0b0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2a0c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
2a0d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a0e0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
2a0f0 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
2a100 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
2a110 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
2a120 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
2a130 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a140 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2a150 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
2a160 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
2a170 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2a180 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
2a190 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
2a1a0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
2a1b0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
2a1c0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
2a1d0 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
2a1e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
2a1f0 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
2a200 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
2a210 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
2a220 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
2a230 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2a240 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
2a250 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
2a260 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
2a270 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
2a280 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
2a290 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
2a2a0 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
2a2b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
2a2c0 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
2a2d0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
2a2e0 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
2a2f0 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
2a300 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
2a310 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
2a320 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
2a330 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
2a340 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
2a350 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
2a360 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
2a370 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
2a380 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
2a390 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
2a3a0 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
2a3b0 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
2a3c0 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
2a3d0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
2a3e0 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
2a3f0 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
2a400 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
2a410 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
2a420 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
2a430 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
2a440 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
2a450 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
2a460 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
2a470 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
2a480 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
2a490 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
2a4a0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
2a4b0 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
2a4c0 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
2a4d0 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
2a4e0 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
2a4f0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
2a500 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
2a510 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
2a520 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a530 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
2a540 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
2a550 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
2a560 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
2a570 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2a580 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
2a590 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
2a5a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ere */.){.  u32 
2a5b0 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  amt;.  assert( p
2a5c0 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
2a5d0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
2a5e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a5f0 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
2a600 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a610 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a620 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a630 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2a640 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2a650 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2a660 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2a670 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2a680 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2a690 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
2a6a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a6b0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2a6c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a6d0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
2a6e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a6f0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2a700 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d>pCur->apPage[p
2a710 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
2a720 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ta || CORRUPT_DB
2a730 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a740 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2a750 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d<pCur->apPage[p
2a760 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
2a770 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f  taEnd ||CORRUPT_
2a780 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e  DB);.  amt = (in
2a790 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t)(pCur->apPage[
2a7a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
2a7b0 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
2a7c0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20  nfo.pPayload);. 
2a7d0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2a7e0 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74  nLocal<amt ) amt
2a7f0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
2a800 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20  ocal;.  *pAmt = 
2a810 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  amt;.  return (v
2a820 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  oid*)pCur->info.
2a830 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  pPayload;.}.../*
2a840 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
2a850 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
2a860 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
2a870 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
2a880 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
2a890 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
2a8a0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
2a8b0 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
2a8c0 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
2a8d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
2a8e0 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
2a8f0 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
2a900 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
2a910 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
2a920 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
2a930 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
2a940 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
2a950 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
2a960 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
2a970 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
2a980 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
2a990 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
2a9a0 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
2a9b0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
2a9c0 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
2a9d0 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
2a9e0 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
2a9f0 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
2aa00 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
2aa10 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
2aa20 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
2aa30 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
2aa40 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
2aa50 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
2aa60 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
2aa70 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
2aa80 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
2aa90 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
2aaa0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
2aab0 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
2aac0 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
2aad0 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
2aae0 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
2aaf0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
2ab00 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
2ab10 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
2ab20 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
2ab30 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
2ab40 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
2ab50 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2ab60 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
2ab70 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
2ab80 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
2ab90 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
2aba0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
2abb0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
2abc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2abd0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2abe0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
2abf0 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
2ac00 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
2ac10 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
2ac20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
2ac30 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
2ac40 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
2ac50 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
2ac60 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
2ac70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
2ac80 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
2ac90 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
2aca0 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
2acb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2acc0 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
2acd0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
2ace0 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
2acf0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
2ad00 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
2ad10 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2ad20 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2ad30 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2ad40 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2ad50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2ad60 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
2ad70 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
2ad80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2ad90 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
2ada0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
2adb0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
2adc0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
2add0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ade0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72  BKPT;.  }.  pCur
2adf0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2ae00 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2ae10 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2ae20 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2ae30 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
2ae40 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d  iPage++;.  pCur-
2ae50 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2ae60 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge] = 0;.  retur
2ae70 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  n getAndInitPage
2ae80 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
2ae90 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2aea0 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20  r->iPage],.     
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aec0 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63     pCur, pCur->c
2aed0 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d  urPagerFlags);.}
2aee0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
2aef0 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
2af00 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
2af10 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
2af20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
2af30 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
2af40 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
2af50 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
2af60 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
2af70 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
2af80 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
2af90 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
2afa0 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
2afb0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2afc0 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
2afd0 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
2afe0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
2aff0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
2b000 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
2b010 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2b020 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
2b030 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
2b040 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
2b050 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
2b060 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
2b070 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
2b080 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74   conditions test
2b090 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e  ed below might n
2b0a0 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20  ot be true.     
2b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0c0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63         ** in a c
2b0d0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
2b0e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  */.  assert( iId
2b0f0 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
2b100 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
2b110 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
2b120 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
2b130 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
2b140 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2b150 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
2b160 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
2b170 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
2b180 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2b190 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
2b1a0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
2b1b0 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
2b1c0 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
2b1d0 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
2b1e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
2b1f0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
2b200 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2b210 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
2b220 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
2b230 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
2b240 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
2b250 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
2b260 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
2b270 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
2b280 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
2b290 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
2b2a0 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
2b2b0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
2b2c0 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
2b2d0 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
2b2e0 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
2b2f0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
2b300 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
2b310 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
2b320 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2b330 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2b340 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2b350 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2b360 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2b370 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
2b380 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b390 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b3a0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2b3b0 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
2b3c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2b3d0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
2b3e0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2b3f0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
2b400 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
2b410 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
2b420 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63  gno.  );.  testc
2b430 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
2b440 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
2b450 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
2b460 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
2b470 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Cell );.  pCur->
2b480 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2b490 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2b4a0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2b4b0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2b4c0 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  vfl);.  releaseP
2b4d0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
2b4e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b4f0 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  age--]);.}../*.*
2b500 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2b510 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
2b520 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
2b530 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
2b540 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
2b550 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
2b560 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
2b570 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
2b580 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
2b590 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
2b5a0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
2b5b0 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
2b5c0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
2b5d0 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
2b5e0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2b5f0 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
2b600 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
2b610 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
2b620 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
2b630 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
2b640 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
2b650 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
2b660 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
2b670 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
2b680 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
2b690 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
2b6a0 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
2b6b0 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
2b6c0 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
2b6d0 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
2b6e0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
2b6f0 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
2b700 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
2b710 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
2b720 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
2b730 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
2b740 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
2b750 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
2b760 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
2b770 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
2b780 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
2b790 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
2b7a0 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
2b7b0 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
2b7c0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
2b7d0 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
2b7e0 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
2b7f0 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
2b800 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
2b810 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
2b820 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
2b830 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
2b840 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
2b850 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
2b860 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
2b870 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
2b880 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
2b890 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
2b8a0 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
2b8b0 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
2b8c0 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
2b8d0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
2b8e0 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
2b8f0 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
2b900 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
2b910 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
2b920 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2b930 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
2b940 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2b950 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
2b960 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b970 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b980 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2b990 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
2b9a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
2b9b0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2b9c0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
2b9d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
2b9e0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2b9f0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
2ba00 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
2ba10 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
2ba20 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
2ba30 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
2ba40 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2ba50 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2ba60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
2ba70 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73  AULT ){.      as
2ba80 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2ba90 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
2baa0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2bab0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
2bac0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2bad0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
2bae0 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
2baf0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
2bb00 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
2bb10 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a   pCur->iPage ){.
2bb20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2bb30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2bb40 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20  >iPage]!=0 );.  
2bb50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
2bb60 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
2bb70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2bb80 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  -]);.    }.  }el
2bb90 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
2bba0 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
2bbb0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2bbc0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2bbd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bbe0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2bbf0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bc00 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20  iPage==(-1) );. 
2bc10 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
2bc20 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
2bc30 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
2bc40 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
2bc50 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20  >apPage[0],.    
2bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc70 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72      0, pCur->cur
2bc80 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20  PagerFlags);.   
2bc90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2bca0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
2bcb0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2bcc0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2bcd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2bce0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
2bcf0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
2bd00 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75  >curIntKey = pCu
2bd10 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
2bd20 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  tKey;.  }.  pRoo
2bd30 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
2bd40 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
2bd50 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
2bd60 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
2bd70 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
2bd80 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
2bd90 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
2bda0 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
2bdb0 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
2bdc0 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
2bdd0 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
2bde0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
2bdf0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
2be00 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
2be10 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
2be20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
2be30 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2be40 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
2be50 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
2be60 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
2be70 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
2be80 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2be90 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
2bea0 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
2beb0 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
2bec0 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2bed0 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
2bee0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
2bef0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
2bf00 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
2bf10 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
2bf20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
2bf30 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
2bf40 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
2bf50 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
2bf60 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
2bf70 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
2bf80 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
2bf90 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
2bfa0 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
2bfb0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2bfc0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
2bfd0 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
2bfe0 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
2bff0 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
2c000 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
2c010 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
2c020 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
2c030 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2c040 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70  T_BKPT;.  }..  p
2c050 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
2c060 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
2c070 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2c080 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2c090 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2c0a0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2c0b0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
2c0c0 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
2c0d0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
2c0e0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2c0f0 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
2c100 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
2c110 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
2c120 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
2c130 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
2c140 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2c150 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
2c160 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
2c170 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
2c180 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
2c190 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
2c1a0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2c1b0 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
2c1c0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2c1d0 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
2c1e0 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
2c1f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2c200 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74  VALID;.  }.  ret
2c210 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2c220 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2c230 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
2c240 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
2c250 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
2c260 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
2c270 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2c280 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
2c290 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
2c2a0 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
2c2b0 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
2c2c0 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
2c2d0 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
2c2e0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2c2f0 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
2c300 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2c310 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2c320 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c330 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2c340 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2c350 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2c360 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2c370 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2c380 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2c390 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2c3a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c3b0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
2c3c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c3d0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
2c3e0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2c3f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c400 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
2c410 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
2c420 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2c430 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
2c440 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c450 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
2c460 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
2c470 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2c480 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c490 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2c4a0 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
2c4b0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
2c4c0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
2c4d0 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
2c4e0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2c4f0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
2c500 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
2c510 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
2c520 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
2c530 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2c540 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
2c550 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2c560 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
2c570 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
2c580 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
2c590 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
2c5a0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
2c5b0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
2c5c0 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
2c5d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
2c5e0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
2c5f0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
2c600 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
2c610 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
2c620 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
2c630 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2c640 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2c650 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2c660 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2c670 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c680 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2c690 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
2c6a0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2c6b0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2c6c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c6d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2c6e0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2c6f0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
2c700 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c710 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
2c720 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2c730 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2c740 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2c750 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
2c760 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c770 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
2c780 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
2c790 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
2c7a0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
2c7b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2c7c0 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
2c7d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
2c7e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2c7f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2c800 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2c810 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2c820 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2c830 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29  _ValidNKey)==0 )
2c840 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2c850 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
2c860 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2c870 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2c880 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
2c890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
2c8a0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
2c8b0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
2c8c0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
2c8d0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
2c8e0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
2c8f0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
2c900 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2c910 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2c920 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
2c930 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2c940 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2c950 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
2c960 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2c970 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2c980 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2c990 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2c9a0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2c9b0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
2c9c0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2c9d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c9e0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2c9f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2ca00 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
2ca10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2ca20 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2ca30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ca40 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
2ca50 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
2ca60 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
2ca70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2ca80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2ca90 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
2caa0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
2cab0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2cac0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2cad0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
2cae0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2caf0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2cb00 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
2cb10 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2cb20 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
2cb30 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
2cb40 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
2cb50 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
2cb60 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
2cb70 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
2cb80 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
2cb90 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
2cba0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2cbb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
2cbc0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2cbd0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2cbe0 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
2cbf0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2cc00 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2cc10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2cc20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2cc30 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2cc40 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
2cc50 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
2cc60 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
2cc70 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
2cc80 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
2cc90 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
2cca0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2ccb0 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
2ccc0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2ccd0 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
2cce0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2ccf0 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
2cd00 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
2cd10 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
2cd20 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
2cd30 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
2cd40 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2cd50 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
2cd60 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
2cd70 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2cd80 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
2cd90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2cda0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
2cdb0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
2cdc0 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
2cdd0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2cde0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2cdf0 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
2ce00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2ce10 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
2ce20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2ce30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ce40 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
2ce50 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
2ce60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2ce70 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2ce80 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2ce90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2cea0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
2ceb0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
2cec0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
2ced0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2cee0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2cef0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2cf00 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2cf10 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2cf20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2cf30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2cf40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2cf50 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
2cf60 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2cf70 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2cf80 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2cf90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2cfa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2cfb0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2cfc0 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2cfd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2cfe0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2cff0 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
2d000 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  st;.      }.   .
2d010 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2d020 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
2d030 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
2d040 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2d050 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
2d060 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
2d070 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
2d080 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
2d090 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
2d0a0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
2d0b0 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
2d0c0 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
2d0d0 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
2d0e0 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
2d0f0 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
2d100 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
2d110 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
2d120 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
2d130 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
2d140 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
2d150 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
2d160 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
2d170 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
2d180 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
2d190 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
2d1a0 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
2d1b0 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
2d1c0 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
2d1d0 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
2d1e0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
2d1f0 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
2d200 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
2d210 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
2d220 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
2d230 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
2d240 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2d250 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
2d260 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
2d270 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
2d280 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
2d290 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
2d2a0 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
2d2b0 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
2d2c0 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
2d2d0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2d2e0 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
2d2f0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2d300 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2d310 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d330 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
2d340 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
2d350 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2d360 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
2d380 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
2d390 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
2d3a0 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
2d3b0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
2d3c0 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
2d3d0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2d3e0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2d3f0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2d400 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
2d410 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
2d420 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
2d430 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
2d440 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2d450 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2d460 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d480 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
2d490 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2d4a0 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
2d4b0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
2d4c0 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
2d4d0 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
2d4e0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
2d4f0 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
2d500 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
2d510 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
2d520 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
2d530 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
2d540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d550 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
2d560 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
2d570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2d580 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
2d590 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
2d5a0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
2d5b0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
2d5c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
2d5d0 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
2d5e0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2d5f0 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
2d600 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2d610 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2d620 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2d630 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2d640 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2d650 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2d660 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2d670 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
2d680 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
2d690 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2d6a0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
2d6b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
2d6c0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2d6d0 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
2d6e0 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
2d6f0 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
2d700 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
2d710 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
2d720 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
2d730 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
2d740 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2d750 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
2d760 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2d770 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26  idNKey)!=0.   &&
2d780 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2d790 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
2d7a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
2d7b0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2d7c0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2d7d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d7e0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2d7f0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2d800 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2d810 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  =0 && pCur->info
2d820 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
2d830 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
2d840 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2d850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2d860 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b    }..  if( pIdxK
2d870 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72  ey ){.    xRecor
2d880 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  dCompare = sqlit
2d890 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
2d8a0 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  e(pIdxKey);.    
2d8b0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2d8c0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2d8d0 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  ( pIdxKey->defau
2d8e0 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20  lt_rc==1 .      
2d8f0 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
2d900 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20  efault_rc==0 .  
2d910 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2d920 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d  y->default_rc==-
2d930 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  1.    );.  }else
2d940 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
2d950 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c  pare = 0; /* All
2d960 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65   keys are intege
2d970 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20  rs */.  }..  rc 
2d980 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2d990 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
2d9a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d9b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
2d9c0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2d9d0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2d9e0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
2d9f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2da00 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2da10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2da20 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20  >iPage]->isInit 
2da30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2da40 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2da50 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
2da60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2da70 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
2da80 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2da90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
2daa0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
2dab0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
2dac0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2dad0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2dae0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2daf0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
2db00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2db10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
2db20 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
2db30 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43  e[0]->intKey==pC
2db40 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b  ur->curIntKey );
2db50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2db60 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49  >curIntKey || pI
2db70 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
2db80 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
2db90 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20   upr, idx, c;.  
2dba0 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
2dbb0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
2dbc0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2dbd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2dbe0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc00 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2dc10 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
2dc20 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
2dc30 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
2dc40 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
2dc50 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
2dc60 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
2dc70 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
2dc80 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
2dc90 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
2dca0 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
2dcb0 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
2dcc0 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
2dcd0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2dce0 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
2dcf0 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
2dd00 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
2dd10 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
2dd20 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
2dd30 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
2dd40 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
2dd50 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
2dd60 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
2dd70 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
2dd80 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
2dd90 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
2dda0 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
2ddb0 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
2ddc0 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
2ddd0 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
2dde0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
2ddf0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
2de00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2de10 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
2de20 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
2de30 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
2de40 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
2de50 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  ll-1;.    assert
2de60 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c  ( biasRight==0 |
2de70 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29  | biasRight==1 )
2de80 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e  ;.    idx = upr>
2de90 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20  >(1-biasRight); 
2dea0 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67  /* idx = biasRig
2deb0 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b  ht ? upr : (lwr+
2dec0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70  upr)/2; */.    p
2ded0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2dee0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2def0 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63  dx;.    if( xRec
2df00 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ordCompare==0 ){
2df10 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2df20 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
2df30 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  lKey;.        pC
2df40 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2df50 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2df60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2df70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
2df80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
2df90 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70  ile( 0x80 <= *(p
2dfa0 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20  Cell++) ){.     
2dfb0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2dfc0 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  >=pPage->aDataEn
2dfd0 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
2dfe0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2dff0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
2e010 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
2e020 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
2e030 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2e040 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
2e050 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2e060 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  idx+1;.         
2e070 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2e080 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d  c = -1; break; }
2e090 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2e0a0 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  f( nCellKey>intK
2e0b0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2e0c0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2e0d0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2e0e0 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72  pr ){ c = +1; br
2e0f0 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2e100 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e110 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
2e120 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ==intKey );.    
2e130 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2e140 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
2e150 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  idNKey;.        
2e160 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
2e170 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
2e180 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
2e190 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2e1a0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2e1b0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2e1c0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2e1d0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2e1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2e1f0 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
2e200 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
2e210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e220 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2e230 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2e240 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e250 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2e260 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2e270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2e280 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e290 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
2e2a0 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
2e2b0 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
2e2c0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  x = (lwr+upr)/2;
2e2d0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2e2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
2e2f0 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  (;;){.        in
2e300 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a  t nCell;  /* Siz
2e310 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63  e of the pCell c
2e320 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ell in bytes */.
2e330 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2e340 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
2e350 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20  pPage, idx);..  
2e360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
2e370 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
2e380 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33  age-size is 6553
2e390 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  6 bytes. This me
2e3a0 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
2e3b0 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
2e3c0 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
2e3d0 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
2e3e0 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
2e3f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
2e400 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36   is less than 16
2e410 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61  384 bytes and ma
2e420 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
2e430 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
2e440 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
2e450 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
2e460 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
2e470 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
2e480 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2e490 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
2e4a0 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
2e4b0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
2e4c0 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
2e4d0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
2e4e0 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
2e4f0 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
2e500 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
2e510 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
2e520 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
2e530 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
2e540 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d  .        nCell =
2e550 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
2e560 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50     if( nCell<=pP
2e570 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
2e580 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
2e590 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2e5a0 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
2e5b0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
2e5c0 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
2e5d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
2e5e0 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
2e5f0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
2e600 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2e610 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
2e620 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
2e630 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
2e640 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
2e650 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d  +nCell+1==pPage-
2e660 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
2e670 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2e680 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2e690 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
2e6a0 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
2e6b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
2e6c0 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
2e6d0 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
2e6e0 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
2e6f0 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
2e700 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
2e710 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
2e720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2e730 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
2e740 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
2e750 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2e760 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
2e770 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
2e780 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
2e790 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2e7a0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2e7b0 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2e7c0 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +2==pPage->aData
2e7d0 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2e7e0 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2e7f0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2e800 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
2e810 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2e820 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e830 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
2e840 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
2e850 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
2e860 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
2e870 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
2e880 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
2e890 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
2e8a0 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
2e8b0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
2e8c0 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
2e8d0 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
2e8e0 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
2e8f0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
2e900 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
2e910 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
2e920 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
2e930 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20  an be called. . 
2e940 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
2e950 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
2e960 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
2e970 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f  t, the xRecordCo
2e980 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61  mpare routine ma
2e990 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20  y read.         
2e9a0 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61   ** up to two va
2e9b0 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65  rints past the e
2e9c0 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
2e9d0 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20  . An extra 18 . 
2e9e0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65           ** byte
2e9f0 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  s of padding is 
2ea00 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65  allocated at the
2ea10 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
2ea20 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  er in.          
2ea30 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70  ** case this hap
2ea40 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  pens.  */.      
2ea50 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
2ea60 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
2ea70 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
2ea80 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
2ea90 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
2eaa0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2eab0 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
2eac0 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
2ead0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
2eae0 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
2eaf0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
2eb00 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
2eb10 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c  testcase( nCell<
2eb20 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  0 );   /* True i
2eb30 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e  f key size is 2^
2eb40 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20  32 or more */.  
2eb50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2eb60 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f  ( nCell==0 );  /
2eb70 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2eb80 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2eb90 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x00 */.         
2eba0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2ebb0 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==1 );  /* Inval
2ebc0 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2ebd0 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a  80 0x80 0x01 */.
2ebe0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2ebf0 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20  se( nCell==2 ); 
2ec00 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61   /* Minimum lega
2ec10 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65  l index key size
2ec20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2ec30 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20  ( nCell<2 ){.   
2ec40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2ec50 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2ec60 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
2ec70 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2ec80 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2ec90 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
2eca0 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
2ecb0 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20  c( nCell+18 );. 
2ecc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
2ecd0 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
2ece0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2ecf0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2ed00 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2ed10 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2ed20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ed30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2ed40 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2ed50 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2ed60 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
2ed70 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
2ed80 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
2ed90 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b  r*)pCellKey, 2);
2eda0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2edb0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2edc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2edd0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2ede0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2edf0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2ee00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2ee10 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2ee20 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
2ee30 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
2ee40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2ee50 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2ee60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ee70 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2ee80 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
2ee90 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2eea0 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
2eeb0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
2eec0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2eed0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
2eee0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2eef0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
2ef00 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2ef10 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
2ef20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2ef30 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
2ef40 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
2ef50 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2ef60 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
2ef70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2ef80 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
2ef90 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2efa0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2efb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2efc0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2efd0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2efe0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2eff0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
2f000 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
2f010 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2f020 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2f030 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2f040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f050 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
2f060 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
2f070 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2f080 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2f090 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2f0a0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2f0b0 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
2f0c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
2f0d0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
2f0e0 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
2f0f0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2f100 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2f110 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2f120 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2f130 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
2f140 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2f150 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
2f160 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2f170 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2f180 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2f190 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2f1a0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2f1b0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
2f1c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f1d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
2f1e0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2f1f0 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78      }.moveto_nex
2f200 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28  t_layer:.    if(
2f210 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
2f220 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
2f230 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
2f240 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2f250 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2f260 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f270 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2f280 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2f290 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
2f2a0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
2f2b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2f2c0 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72   (u16)lwr;.    r
2f2d0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2f2e0 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
2f2f0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
2f300 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  k;.  }.moveto_fi
2f310 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e  nish:.  pCur->in
2f320 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2f330 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2f340 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2f350 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2f360 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
2f370 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2f380 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
2f390 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2f3a0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2f3b0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2f3c0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
2f3d0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
2f3e0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2f3f0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
2f400 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
2f410 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2f420 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
2f430 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
2f440 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
2f450 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
2f460 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
2f470 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
2f480 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2f490 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
2f4a0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
2f4b0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2f4c0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
2f4d0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
2f4e0 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
2f4f0 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
2f500 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
2f510 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
2f520 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
2f530 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
2f540 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
2f550 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
2f560 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
2f570 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
2f580 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
2f590 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
2f5a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
2f5b0 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
2f5c0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
2f5d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f5e0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
2f5f0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
2f600 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
2f610 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
2f620 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
2f630 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2f640 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
2f650 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
2f660 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
2f670 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
2f680 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
2f690 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2f6a0 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  s sqlite3BtreeNe
2f6b0 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  xt().  That rout
2f6c0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2f6d0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2f6e0 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2f6f0 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  y incrementing t
2f700 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2f710 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2f720 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65  * to the next ce
2f730 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2f740 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2f750 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28  ower) btreeNext(
2f760 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74  ) helper.** rout
2f770 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2f780 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2f790 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2f7a0 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f  different page o
2f7b0 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20  r.** to restore 
2f7c0 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2f7d0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2f7e0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
2f7f0 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
2f800 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
2f810 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
2f820 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
2f830 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
2f840 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
2f850 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2f860 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
2f870 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2f880 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2f890 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
2f8a0 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
2f8b0 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
2f8c0 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
2f8d0 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
2f8e0 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
2f8f0 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
2f900 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
2f910 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2f920 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
2f930 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
2f940 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
2f950 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
2f960 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
2f970 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
2f980 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
2f990 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2f9a0 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
2f9b0 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
2f9c0 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
2f9d0 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
2f9e0 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
2f9f0 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
2fa00 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2fa10 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
2fa20 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2fa30 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2fa40 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
2fa50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2fa60 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2fa70 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2fa80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2fa90 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2faa0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2fab0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2fac0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2fad0 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  s==0 );.  if( pC
2fae0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2faf0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2fb00 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2fb10 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2fb20 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2fb30 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2fb40 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2fb50 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2fb60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fb70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2fb80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2fb90 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2fba0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2fbb0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2fbc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2fbd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2fbe0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2fbf0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2fc00 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2fc10 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2fc20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2fc30 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2fc40 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2fc50 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2fc60 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2fc70 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
2fc80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2fc90 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2fca0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fcb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2fcc0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2fcd0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2fce0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2fcf0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2fd00 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2fd10 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
2fd20 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2fd30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2fd40 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
2fd50 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2fd60 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2fd70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2fd80 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2fd90 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2fda0 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2fdb0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2fdc0 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2fdd0 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2fde0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2fdf0 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2fe00 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2fe10 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2fe20 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2fe30 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2fe40 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2fe50 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2fe60 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2fe70 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2fe80 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2fe90 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2fea0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2feb0 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2fec0 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2fed0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2fee0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2fef0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2ff00 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2ff10 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2ff20 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2ff30 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2ff40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2ff50 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2ff60 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2ff70 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2ff80 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2ff90 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2ffa0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2ffb0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2ffc0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2ffd0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2ffe0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2fff0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30000 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
30010 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
30020 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
30030 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
30040 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
30050 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
30060 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
30070 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
30080 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
30090 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
300a0 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
300b0 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
300c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
300d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
300e0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
300f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
30100 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
30110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
30120 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
30130 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
30140 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
30150 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
30160 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
30170 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65  int *pRes){.  Me
30180 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
30190 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
301a0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
301b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
301c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
301d0 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
301e0 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
301f0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
30200 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
30210 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
30220 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ID );.  pCur->in
30230 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
30240 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
30250 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
30260 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
30270 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b  l);.  *pRes = 0;
30280 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
30290 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
302a0 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65  D ) return btree
302b0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
302c0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
302d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
302e0 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b  Page];.  if( (++
302f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
30300 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65  ->iPage])>=pPage
30310 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
30320 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
30330 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72  >iPage]--;.    r
30340 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
30350 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d  pCur, pRes);.  }
30360 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
30370 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
30380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
30390 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
303a0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
303b0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Cur);.  }.}../*.
303c0 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
303d0 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
303e0 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
303f0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
30400 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
30410 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
30420 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
30430 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
30440 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
30450 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
30460 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
30470 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
30480 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
30490 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
304a0 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54  *pRes=1..**.** T
304b0 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
304c0 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
304d0 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20  reePrevious().  
304e0 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
304f0 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
30500 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
30510 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65   of merely decre
30520 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
30530 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
30540 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
30550 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20  e previous cell 
30560 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
30570 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
30580 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  r) btreePrevious
30590 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75  ().** helper rou
305a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
305b0 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
305c0 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
305d0 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a   different page.
305e0 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65  ** or to restore
305f0 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
30600 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
30610 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
30620 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
30630 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
30640 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
30650 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
30660 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
30670 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
30680 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
30690 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
306a0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
306b0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
306c0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
306d0 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
306e0 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
306f0 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
30700 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
30710 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
30720 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
30730 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
30740 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
30750 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
30760 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
30770 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
30780 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
30790 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
307a0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
307b0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
307c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
307d0 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
307e0 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
307f0 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
30800 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
30810 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
30820 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
30830 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
30840 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
30850 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
30860 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
30870 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
30880 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
30890 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
308a0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
308b0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
308c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
308d0 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res==0 );.  asse
308e0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
308f0 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
30900 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
30910 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
30920 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
30930 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
30940 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
30950 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
30960 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
30970 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
30980 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
30990 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
309a0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
309b0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
309c0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
309d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
309e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
309f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
30a00 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
30a10 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
30a20 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
30a30 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
30a40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30a60 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
30a70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30a80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
30a90 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
30aa0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
30ab0 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
30ac0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
30ad0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
30ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
30af0 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a  ->skipNext<0 ){.
30b00 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
30b10 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
30b20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30b30 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
30b40 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
30b50 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
30b60 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
30b70 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
30b80 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
30b90 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
30ba0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
30bb0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
30bc0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
30bd0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
30be0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
30bf0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
30c00 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
30c10 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
30c20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
30c30 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f   rc;.    rc = mo
30c40 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
30c50 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
30c60 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
30c70 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
30c80 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
30c90 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
30ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
30cb0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
30cc0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
30cd0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
30ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
30cf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
30d00 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
30d10 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
30d20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
30d30 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
30d40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
30d50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
30d60 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79   (BTCF_ValidNKey
30d70 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
30d80 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75  )==0 );..    pCu
30d90 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
30da0 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
30db0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
30dc0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
30dd0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
30de0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
30df0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
30e00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
30e10 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
30e20 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
30e30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
30e40 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
30e50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30e60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
30e70 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
30e80 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
30e90 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  es){.  assert( c
30ea0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
30eb0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
30ec0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
30ed0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
30ee0 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
30ef0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
30f00 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
30f10 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
30f20 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a  SOR_VALID );.  *
30f30 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72  pRes = 0;.  pCur
30f40 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
30f50 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
30f60 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
30f70 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
30f80 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
30f90 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
30fa0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
30fb0 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
30fc0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
30fd0 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  ge]==0.   || pCu
30fe0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
30ff0 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a  iPage]->leaf==0.
31000 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
31010 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
31020 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
31030 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
31040 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72  r->iPage]--;.  r
31050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
31070 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
31080 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
31090 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
310a0 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
310b0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
310c0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
310d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
310e0 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
310f0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
31100 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
31110 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
31120 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
31130 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
31140 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
31150 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
31160 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
31170 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
31180 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
31190 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
311a0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
311b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
311c0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
311d0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
311e0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
311f0 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
31200 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
31210 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ULL in the event
31220 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
31230 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
31240 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
31250 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
31260 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
31270 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
31280 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
31290 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
312a0 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
312b0 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
312c0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
312d0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
312e0 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
312f0 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
31300 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
31310 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
31320 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
31330 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
31340 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
31350 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
31360 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
31370 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
31380 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
31390 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
313a0 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
313b0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
313c0 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
313d0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
313e0 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
313f0 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
31400 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
31410 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
31420 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
31430 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
31440 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
31450 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
31460 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
31470 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
31480 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
31490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
314a0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
314b0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
314c0 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
314d0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
314e0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
314f0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
31500 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
31510 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
31520 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
31530 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
31540 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
31550 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
31560 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
31570 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
31580 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
31590 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
315a0 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
315b0 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
315c0 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
315d0 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
315e0 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
315f0 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
31600 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
31610 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31620 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
31630 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
31640 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
31650 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
31660 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
31670 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
31680 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
31690 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
316a0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
316b0 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
316c0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
316d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
316e0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
316f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
31700 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
31710 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
31720 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
31730 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 52  | (nearby>0 && R
31740 45 51 55 49 52 45 5f 50 54 52 4d 41 50 20 29 20  EQUIRE_PTRMAP ) 
31750 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
31760 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
31770 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
31780 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
31790 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
317a0 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
317b0 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
317c0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
317d0 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
317e0 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
317f0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
31800 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
31810 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
31820 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31830 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
31840 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
31850 2d 31 20 29 3b 0a 20 20 69 66 28 20 49 53 43 4f  -1 );.  if( ISCO
31860 4e 43 55 52 52 45 4e 54 3d 3d 30 20 26 26 20 6e  NCURRENT==0 && n
31870 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
31880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
31890 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
318a0 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 70 61 67  .  /* Ensure pag
318b0 65 20 31 20 69 73 20 77 72 69 74 61 62 6c 65 2e  e 1 is writable.
318c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
318d0 69 6c 6c 20 65 69 74 68 65 72 20 63 68 61 6e 67  ill either chang
318e0 65 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 2a  e the number.  *
318f0 2a 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  * of pages in th
31900 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 72 20 74  e free-list or t
31910 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
31920 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 69  atabase file. Si
31930 6e 63 65 20 62 6f 74 68 0a 20 20 2a 2a 20 6f 66  nce both.  ** of
31940 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e   these operation
31950 73 20 69 6e 76 6f 6c 76 65 20 6d 6f 64 69 66 79  s involve modify
31960 69 6e 67 20 70 61 67 65 20 31 20 68 65 61 64 65  ing page 1 heade
31970 72 20 66 69 65 6c 64 73 2c 20 70 61 67 65 20 31  r fields, page 1
31980 0a 20 20 2a 2a 20 77 69 6c 6c 20 64 65 66 69 6e  .  ** will defin
31990 69 74 65 6c 79 20 62 65 20 77 72 69 74 74 65 6e  itely be written
319a0 20 62 79 20 74 68 69 73 20 74 72 61 6e 73 61 63   by this transac
319b0 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73  tion. If this is
319c0 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 0a 20   an CONCURRENT. 
319d0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c   ** transaction,
319e0 20 65 6e 73 75 72 65 20 74 68 65 20 42 74 72 65   ensure the Btre
319f0 65 50 74 72 6d 61 70 20 73 74 72 75 63 74 75 72  ePtrmap structur
31a00 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
31a10 61 74 65 64 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  ated.  */.  rc =
31a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31a30 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
31a40 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
31a50 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
31a60 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
31a70 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
31a80 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
31a90 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
31aa0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
31ab0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
31ac0 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
31ad0 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
31ae0 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
31af0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
31b00 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
31b10 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b  u32 nSearch = 0;
31b20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74     /* Count of t
31b30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61  he number of sea
31b40 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a  rch attempts */.
31b50 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65      .    /* If e
31b60 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
31b70 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20  ACT and a query 
31b80 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
31b90 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
31ba0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
31bb0 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
31bc0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
31bd0 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
31be0 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
31bf0 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
31c00 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
31c10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
31c20 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
31c30 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 61  EXACT ){.      a
31c40 73 73 65 72 74 28 20 49 53 41 55 54 4f 56 41 43  ssert( ISAUTOVAC
31c50 55 55 4d 21 3d 49 53 43 4f 4e 43 55 52 52 45 4e  UUM!=ISCONCURREN
31c60 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  T );.      if( I
31c70 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
31c80 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
31c90 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
31ca0 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
31cb0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31cc0 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
31cd0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31ce0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31cf0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
31d00 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
31d10 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
31d20 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
31d30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
31d40 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  rc;.          if
31d50 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
31d60 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
31d70 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
31d80 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  st = 1;.        
31d90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31db0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
31dc0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
31dd0 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
31de0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
31df0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
31e00 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
31e10 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
31e20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
31e30 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
31e40 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
31e50 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
31e60 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
31e70 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
31e80 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
31e90 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  1..    */.    pu
31ea0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31eb0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
31ec0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
31ed0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
31ee0 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
31ef0 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
31f00 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
31f10 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
31f20 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
31f30 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
31f40 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
31f50 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
31f60 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
31f70 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
31f80 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
31f90 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
31fa0 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
31fb0 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
31fc0 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
31fd0 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
31fe0 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
31ff0 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
32000 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
32010 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
32020 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
32030 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
32040 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31  CE-OF: R-01506-1
32050 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69  1053 The first i
32060 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
32070 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
32080 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68          ** is th
32090 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
320a0 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69   the next freeli
320b0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
320c0 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20   the list or.   
320d0 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20       ** zero if 
320e0 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74  this is the last
320f0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
32100 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
32110 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
32120 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
32130 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
32140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32150 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
32160 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68  R-59841-13798 Th
32170 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
32180 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
32190 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20  ffset 32.       
321a0 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70   ** stores the p
321b0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
321c0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
321d0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72  the freelist, or
321e0 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20   zero if.       
321f0 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
32200 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20   is empty. */.  
32210 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
32220 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
32230 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
32240 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
32250 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
32260 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
32270 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c   iTrunk>mxPage |
32280 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20  | nSearch++ > n 
32290 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
322a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
322b0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
322c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
322d0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
322e0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
322f0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
32300 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
32310 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
32320 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
32330 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
32340 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
32350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
32360 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
32370 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
32380 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
32390 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
323a0 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
323b0 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
323c0 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
323d0 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
323e0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
323f0 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
32400 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
32410 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
32420 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
32430 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
32440 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
32450 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
32460 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
32470 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
32480 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
32490 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
324a0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
324b0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
324c0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
324d0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
324e0 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
324f0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
32500 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
32510 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
32520 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
32530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32540 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
32550 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
32560 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
32570 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32580 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
32590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
325a0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
325b0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
325c0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
325d0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
325e0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
325f0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
32600 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
32610 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
32620 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
32630 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
32640 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
32650 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
32660 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
32670 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
32680 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
32690 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
326a0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
326b0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
326c0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
326d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
326e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
326f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
32700 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32710 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
32720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32730 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
32740 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
32750 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
32760 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
32770 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
32780 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
32790 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
327a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
327b0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
327c0 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
327d0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
327e0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
327f0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
32800 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
32810 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
32820 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
32830 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
32840 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
32850 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
32860 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
32870 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
32880 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32890 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
328a0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
328b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
328c0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
328d0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
328e0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
328f0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
32900 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
32910 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
32920 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
32930 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
32940 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
32950 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
32960 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
32970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32980 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32990 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
329a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
329b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
329c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
329d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
329e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
329f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32a00 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32a10 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
32a20 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
32a30 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
32a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32a60 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
32a70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
32a80 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
32a90 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
32aa0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
32ab0 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
32ac0 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
32ad0 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
32ae0 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
32af0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
32b00 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
32b10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
32b20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
32b30 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
32b40 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
32b50 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
32b60 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
32b70 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
32b80 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
32b90 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32ba0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
32bb0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
32bc0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32bd0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32be0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
32bf0 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
32c00 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
32c10 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
32c20 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
32c30 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
32c40 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
32c50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32c60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32c70 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
32c80 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32c90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
32ca0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
32cb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32cc0 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
32cd0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
32ce0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32d00 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
32d10 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
32d20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32d30 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32d50 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
32d60 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
32d70 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
32d80 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
32d90 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
32da0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
32db0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
32dc0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
32dd0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
32de0 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
32df0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
32e00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
32e10 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
32e20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
32e30 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
32e40 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
32e50 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
32e60 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
32e70 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
32e80 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
32e90 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
32ea0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
32eb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32ec0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32ed0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32ee0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
32ef0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
32f00 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
32f10 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
32f20 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32f30 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
32f40 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
32f50 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
32f60 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
32f70 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
32f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
32f90 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
32fa0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
32fb0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
32fc0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
32fd0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
32fe0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
32ff0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
33000 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
33010 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
33020 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
33030 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
33040 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
33050 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
33060 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
33070 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
33080 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
33090 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
330a0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
330b0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
330c0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
330d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
330e0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
330f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
33100 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
33110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
33120 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
33130 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
33140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
33150 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
33160 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
33170 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
33180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
33190 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
331a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
331b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
331c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
331d0 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
331e0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
331f0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
33200 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
33210 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
33220 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
33230 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
33240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
33250 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
33260 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
33270 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
33280 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
33290 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
332a0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
332b0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
332c0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
332d0 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
332e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
332f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
33300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33320 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
33330 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
33340 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
33350 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
33360 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
33370 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
33380 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
33390 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
333a0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
333b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
333c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
333d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
333e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
333f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33400 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
33410 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
33420 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
33430 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
33440 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
33450 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
33460 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
33470 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
33480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
33490 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
334a0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
334b0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
334c0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
334d0 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
334e0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
334f0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
33500 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
33510 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
33520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33530 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
33540 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
33550 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
33560 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33570 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
33580 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
33590 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
335a0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
335b0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
335c0 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
335d0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
335e0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
335f0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
33600 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
33610 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
33620 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
33630 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
33640 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
33650 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
33660 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
33670 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
33680 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
33690 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
336a0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
336b0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
336c0 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
336d0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
336e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
336f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33700 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33710 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
33720 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33730 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33750 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
33760 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
33770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
33780 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
33790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
337a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
337b0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
337c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
337d0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
337e0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
337f0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
33800 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
33810 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
33820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
33830 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
33840 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
33850 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
33860 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
33870 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
33880 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
33890 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
338a0 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
338b0 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
338c0 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
338d0 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
338e0 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
338f0 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
33900 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
33910 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
33920 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
33930 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
33940 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
33950 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
33960 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
33970 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
33980 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
33990 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
339a0 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
339b0 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
339c0 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
339d0 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
339e0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
339f0 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
33a00 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
33a10 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
33a20 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
33a30 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
33a40 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
33a50 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
33a60 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
33a70 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
33a80 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
33a90 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
33aa0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
33ab0 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
33ac0 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
33ad0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
33ae0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
33af0 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
33b00 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
33b10 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
33b20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
33b30 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
33b40 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
33b50 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
33b60 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
33b70 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
33b80 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
33b90 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
33ba0 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
33bb0 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
33bc0 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
33bd0 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
33be0 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
33bf0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
33c00 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
33c10 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
33c20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33c30 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
33c40 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
33c50 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
33c60 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
33c70 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
33c80 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
33c90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33ca0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
33cb0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
33cc0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
33cd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
33ce0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
33cf0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
33d00 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
33d10 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
33d20 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
33d30 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33d40 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
33d50 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
33d60 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
33d70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
33d80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
33d90 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
33da0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
33db0 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
33dc0 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
33dd0 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
33de0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
33df0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
33e00 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
33e10 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
33e20 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
33e30 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
33e40 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
33e50 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
33e60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
33e70 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
33e80 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
33e90 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
33ea0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
33eb0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
33ec0 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
33ed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33ee0 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
33ef0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
33f00 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
33f10 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
33f20 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
33f30 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
33f40 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
33f50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33f60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
33f70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33f80 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
33f90 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
33fa0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
33fb0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
33fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33fd0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
33fe0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
33ff0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
34000 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
34010 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
34020 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
34030 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
34040 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
34050 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
34060 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
34070 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
34080 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
34090 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
340a0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
340b0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
340c0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
340d0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
340e0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
340f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
34100 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
34110 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
34120 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
34130 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
34140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34150 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
34160 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
34170 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
34180 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
34190 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
341a0 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
341b0 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
341c0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
341d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
341e0 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
341f0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
34200 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
34210 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
34220 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
34230 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
34240 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
34250 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
34260 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
34270 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
34280 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
34290 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
342a0 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
342b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
342c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
342d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
342e0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
342f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
34300 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
34310 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
34320 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
34330 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
34340 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
34350 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
34360 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
34370 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
34380 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
34390 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
343a0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
343b0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
343c0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
343d0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
343e0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
343f0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
34400 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
34410 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
34420 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
34430 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
34440 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
34450 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
34460 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
34470 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
34480 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
34490 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
344a0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
344b0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
344c0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
344d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
344e0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
344f0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
34500 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
34510 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
34520 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
34530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34540 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
34550 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
34560 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
34570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34580 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
34590 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
345a0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
345b0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
345c0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
345d0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
345e0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
345f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
34600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34610 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
34620 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
34630 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
34640 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
34650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34660 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
34670 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
34680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34690 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
346a0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
346b0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
346c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
346d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
346e0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
346f0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
34700 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
34710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
34720 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
34730 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
34740 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
34750 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
34760 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34770 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
34780 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
34790 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
347a0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
347b0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
347c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
347d0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
347e0 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
347f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
34800 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
34810 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
34820 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
34830 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34840 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
34850 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34860 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34870 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
34880 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34890 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
348a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
348b0 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
348c0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
348d0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
348e0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
348f0 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
34900 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
34910 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
34920 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
34930 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
34940 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
34950 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
34960 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
34970 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
34980 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
34990 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
349a0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
349b0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
349c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
349d0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
349e0 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
349f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
34a00 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
34a10 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
34a20 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
34a30 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
34a40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
34a50 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
34a60 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
34a70 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
34a80 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
34a90 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
34aa0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
34ab0 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
34ac0 2f 0a 20 20 69 66 28 20 52 45 51 55 49 52 45 5f  /.  if( REQUIRE_
34ad0 50 54 52 4d 41 50 20 29 7b 0a 20 20 20 20 70 74  PTRMAP ){.    pt
34ae0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
34af0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
34b00 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
34b10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34b20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34b30 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
34b40 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
34b50 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
34b60 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
34b70 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
34b80 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
34b90 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
34ba0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
34bb0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
34bc0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
34bd0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
34be0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
34bf0 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
34c00 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
34c10 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
34c20 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
34c30 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
34c40 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
34c50 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
34c60 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
34c70 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
34c80 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
34c90 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
34ca0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
34cb0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
34cc0 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
34cd0 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
34ce0 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
34cf0 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
34d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
34d10 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
34d20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
34d30 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
34d40 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
34d50 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
34d60 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
34d70 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
34d80 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
34d90 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
34da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34db0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
34dc0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
34dd0 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
34de0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
34df0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
34e00 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
34e10 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
34e20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
34e30 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
34e40 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
34e50 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
34e60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
34e70 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34e80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
34e90 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
34ea0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
34eb0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
34ec0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34ed0 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
34ee0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
34ef0 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
34f00 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
34f10 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
34f20 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
34f30 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
34f40 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
34f50 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
34f60 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
34f70 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
34f80 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
34f90 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
34fa0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
34fb0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
34fc0 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
34fd0 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
34fe0 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
34ff0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
35000 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
35010 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
35020 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
35030 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
35040 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
35050 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
35060 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
35070 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
35080 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
35090 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
350a0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
350b0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
350c0 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
350d0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
350e0 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
350f0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
35100 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
35110 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
35120 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
35130 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
35140 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
35150 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
35160 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
35170 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
35180 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
35190 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
351a0 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
351b0 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
351c0 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
351d0 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
351e0 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
351f0 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
35200 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
35210 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
35220 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
35230 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
35240 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
35250 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
35260 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
35270 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
35280 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
35290 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
352a0 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
352b0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
352c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
352d0 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
352e0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
352f0 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
35300 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
35310 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
35320 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
35330 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35340 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
35350 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
35360 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35380 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
35390 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
353a0 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
353b0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
353c0 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
353d0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
353e0 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
353f0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
35400 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
35410 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
35420 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
35430 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
35440 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
35450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
35460 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
35470 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
35480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35490 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
354a0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
354b0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
354c0 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
354d0 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
354e0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
354f0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
35500 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
35510 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
35520 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
35530 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
35540 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
35550 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
35560 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
35570 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
35580 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
35590 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
355a0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
355b0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
355c0 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
355d0 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
355e0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
355f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
35600 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
35610 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
35620 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
35630 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
35640 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
35650 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
35660 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
35670 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
35680 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
35690 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
356a0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
356b0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
356c0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
356d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
356e0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
356f0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
35700 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35710 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
35720 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
35730 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
35740 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
35750 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
35760 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
35770 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
35780 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
35790 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
357a0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
357b0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
357c0 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
357d0 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
357e0 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
357f0 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
35800 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
35810 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
35820 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
35830 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
35840 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
35850 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
35860 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
35870 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
35880 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
35890 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
358a0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
358b0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
358c0 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
358d0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
358e0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
358f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
35900 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35910 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
35920 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
35930 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
35940 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
35950 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
35960 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
35970 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
35980 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
35990 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
359a0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
359b0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
359c0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
359d0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
359e0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
359f0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
35a00 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
35a10 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
35a20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20   u16 *pnSize    
35a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
35a40 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
35a50 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a  he Cell here */.
35a60 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
35a70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
35a80 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
35a90 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
35aa0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
35ab0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
35ac0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
35ad0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35ae0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
35af0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
35b00 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
35b10 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
35b20 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70  ll, &info);.  *p
35b30 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
35b40 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  ze;.  if( info.i
35b50 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
35b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35b70 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
35b80 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
35b90 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
35ba0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
35bb0 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66  .  if( pCell+inf
35bc0 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20  o.iOverflow+3 > 
35bd0 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
35be0 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
35bf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35c00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
35c10 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
35c20 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
35c30 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
35c40 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
35c50 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
35c60 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
35c70 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
35c80 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
35c90 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
35ca0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
35cb0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
35cc0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
35cd0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
35ce0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
35cf0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
35d00 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
35d10 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
35d20 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
35d30 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
35d40 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
35d50 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
35d60 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
35d70 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
35d80 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
35d90 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
35da0 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
35db0 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
35dc0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
35dd0 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
35de0 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
35df0 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
35e00 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
35e10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
35e20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
35e30 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
35e40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
35e50 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
35e60 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
35e70 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
35e80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35e90 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
35ea0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
35eb0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
35ec0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
35ed0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
35ee0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
35ef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
35f00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
35f10 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
35f20 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
35f30 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
35f40 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
35f50 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
35f60 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
35f70 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
35f80 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
35f90 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
35fa0 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
35fb0 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
35fc0 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
35fd0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
35fe0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
35ff0 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
36000 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
36010 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
36020 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
36030 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
36040 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
36050 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
36060 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
36070 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
36080 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
36090 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
360a0 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
360b0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
360c0 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
360d0 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
360e0 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
360f0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
36100 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
36110 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
36120 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
36130 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
36140 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
36150 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
36160 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
36170 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
36180 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
36190 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
361a0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
361b0 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
361c0 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
361d0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
361e0 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
361f0 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
36200 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
36210 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
36220 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
36230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
36240 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
36250 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
36260 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
36270 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
36280 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36290 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
362a0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
362b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
362c0 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
362d0 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
362e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
362f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
36300 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
36310 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
36320 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
36330 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
36340 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
36350 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
36360 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
36370 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
36380 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
36390 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
363a0 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
363b0 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
363c0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
363d0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
363e0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
363f0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
36400 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
36410 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
36420 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
36430 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
36440 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
36450 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
36460 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
36470 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
36480 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
36490 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
364a0 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
364b0 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
364c0 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
364d0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
364e0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
364f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
36500 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
36510 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
36520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36530 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
36540 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
36550 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
36560 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
36570 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
36580 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
36590 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
365a0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
365b0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
365c0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
365d0 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
365e0 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
365f0 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
36600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36610 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
36620 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
36630 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
36640 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
36650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36660 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
36670 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
36680 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
36690 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
366a0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
366b0 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
366c0 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
366d0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
366e0 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
366f0 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
36700 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
36710 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
36720 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
36730 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
36740 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
36750 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
36760 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
36770 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
36780 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
36790 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
367a0 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
367b0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
367c0 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
367d0 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
367e0 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
367f0 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
36800 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
36810 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
36820 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
36830 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
36840 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
36850 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
36860 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
36870 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
36880 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36890 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
368a0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
368b0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
368c0 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
368d0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
368e0 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
368f0 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
36900 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
36910 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
36920 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
36930 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
36940 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
36950 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36960 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30  assert( nData==0
36970 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36980 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nZero==0 );.  }.
36990 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
369a0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
369b0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
369c0 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  nKey);.  .  /* F
369d0 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
369e0 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28  ad size */.  if(
369f0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
36a00 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
36a10 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
36a20 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
36a30 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
36a40 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c     assert( nKey<
36a50 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70  =0x7fffffff && p
36a60 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50  Key!=0 );.    nP
36a70 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b  ayload = (int)nK
36a80 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
36a90 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
36aa0 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
36ab0 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
36ac0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
36ad0 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65  {.    n = nHeade
36ae0 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  r + nPayload;.  
36af0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33    testcase( n==3
36b00 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
36b10 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66  ( n==4 );.    if
36b20 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20  ( n<4 ) n = 4;. 
36b30 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a     *pnSize = n;.
36b40 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
36b50 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50  nPayload;.    pP
36b60 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  rior = pCell;.  
36b70 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
36b80 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  n = pPage->minLo
36b90 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20  cal;.    n = mn 
36ba0 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e  + (nPayload - mn
36bb0 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
36bc0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
36bd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
36be0 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
36bf0 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
36c00 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
36c10 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
36c20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d  if( n > pPage->m
36c30 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e  axLocal ) n = mn
36c40 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
36c50 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = n;.    *pnSize
36c60 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
36c70 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   4;.    pPrior =
36c80 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b   &pCell[nHeader+
36c90 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f  n];.  }.  pPaylo
36ca0 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
36cb0 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  der];..  /* At t
36cc0 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
36cd0 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
36ce0 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
36cf0 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
36d00 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
36d10 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
36d20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
36d30 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
36d40 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
36d50 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
36d60 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
36d70 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
36d80 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
36d90 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
36da0 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
36db0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
36dc0 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
36dd0 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
36de0 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
36df0 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
36e00 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
36e10 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
36e20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
36e30 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
36e40 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
36e50 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
36e60 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
36e70 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
36e80 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
36e90 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
36ea0 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
36eb0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
36ec0 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
36ed0 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
36ee0 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
36ef0 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
36f00 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f    */.#if SQLITE_
36f10 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
36f20 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
36f30 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
36f40 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
36f50 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
36f60 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e  ert( nHeader=(in
36f70 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
36f80 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
36f90 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
36fa0 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ey==nKey );.    
36fb0 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
36fc0 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
36fd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
36fe0 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
36ff0 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  Local );.    ass
37000 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26  ert( pPrior == &
37010 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
37020 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e  flow] );.  }.#en
37030 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
37040 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
37050 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
37060 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
37070 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
37080 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50  s */.  while( nP
37090 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
370a0 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
370b0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
370c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
370d0 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
370e0 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
370f0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
37100 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
37110 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
37120 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
37130 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
37140 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
37150 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
37160 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
37170 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
37180 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
37190 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
371a0 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
371b0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
371c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
371d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
371e0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
371f0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
37200 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
37210 4f 76 66 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 20  Ovfl, 0);..     
37220 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
37230 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
37240 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
37250 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
37260 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
37270 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
37280 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
37290 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
372a0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
372b0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
372c0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
372d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
372e0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
372f0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
37300 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
37310 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
37320 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
37330 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
37340 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
37350 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
37360 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
37370 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
37380 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
37390 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
373a0 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
373b0 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
373c0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
373d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61  uninitialized va
373e0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
373f0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
37400 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
37410 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
37420 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 52    */.      if( R
37430 45 51 55 49 52 45 5f 50 54 52 4d 41 50 20 26 26  EQUIRE_PTRMAP &&
37440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37450 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
37460 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
37470 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
37480 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
37490 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
374a0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
374b0 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
374c0 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
374d0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
374e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
374f0 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
37500 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37510 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
37520 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
37530 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
37540 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
37550 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
37560 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
37570 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
37580 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
37590 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
375a0 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
375b0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
375c0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
375d0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
375e0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
375f0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
37600 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
37610 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
37620 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
37630 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
37640 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
37650 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
37660 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
37670 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
37680 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
37690 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
376a0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
376b0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
376c0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
376d0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
376e0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
376f0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
37700 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
37710 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
37720 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
37730 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
37740 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
37750 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37760 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
37770 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
37780 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
37790 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
377a0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
377b0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
377c0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
377d0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
377e0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
377f0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
37800 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
37810 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
37820 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
37830 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
37840 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
37850 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
37860 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
37870 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
37880 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
37890 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
378a0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
378b0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
378c0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
378d0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
378e0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
378f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
37900 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
37910 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
37920 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
37930 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
37940 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
37950 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
37960 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
37970 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
37980 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
37990 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
379a0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
379b0 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
379c0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
379d0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
379e0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
379f0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
37a00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
37a10 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
37a20 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
37a30 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
37a40 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
37a50 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
37a60 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
37a70 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
37a80 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
37a90 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
37aa0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
37ab0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
37ac0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
37ad0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
37ae0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
37af0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
37b00 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
37b10 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
37b20 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
37b30 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
37b40 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
37b50 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
37b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37b70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
37b80 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
37b90 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
37ba0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
37bb0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
37bc0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
37bd0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
37be0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
37bf0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
37c00 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
37c10 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
37c20 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
37c30 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
37c40 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
37c50 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
37c60 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
37c70 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
37c80 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
37c90 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
37ca0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
37cb0 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
37cc0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
37cd0 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
37ce0 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
37cf0 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
37d00 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
37d10 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
37d20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
37d30 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
37d40 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
37d50 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
37d60 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
37d70 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
37d80 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
37d90 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
37da0 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
37db0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
37dc0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
37dd0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
37de0 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
37df0 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
37e00 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
37e10 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
37e20 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
37e30 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
37e40 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
37e50 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
37e60 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69  DB || sz==cellSi
37e70 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
37e80 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
37e90 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37ea0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
37eb0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
37ec0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
37ed0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
37ee0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
37ef0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
37f00 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
37f10 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
37f20 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
37f30 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
37f40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
37f50 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
37f60 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
37f70 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
37f80 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
37f90 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
37fa0 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
37fb0 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74  c < (u32)get2byt
37fc0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
37fd0 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  || pc+sz > pPage
37fe0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37ff0 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
38000 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
38010 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
38020 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
38030 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
38040 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
38050 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
38060 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
38070 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
38080 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  -;.  if( pPage->
38090 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
380a0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
380b0 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  +1], 0, 4);.    
380c0 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
380d0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
380e0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67  ata[hdr+5], pPag
380f0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
38100 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze);.    pPage->
38110 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70  nFree = pPage->p
38120 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
38130 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
38140 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
38150 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65           - pPage
38160 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d  ->childPtrSize -
38170 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   8;.  }else{.   
38180 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
38190 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
381a0 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
381b0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
381c0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
381d0 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
381e0 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
381f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
38200 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
38210 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
38220 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
38230 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
38240 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
38250 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
38260 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
38270 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
38280 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
38290 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
382a0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
382b0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
382c0 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
382d0 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
382e0 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
382f0 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
38300 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
38310 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
38320 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
38330 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
38340 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
38350 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
38360 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
38370 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
38380 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
38390 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
383a0 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
383b0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
383c0 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
383d0 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
383e0 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
383f0 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
38400 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ented..*/.static
38410 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c   void insertCell
38420 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
38430 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
38440 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
38450 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
38460 20 69 2c 20 20 20 20