/ Hex Artifact Content
Login

Artifact 62662509b621cc87334bb3e9afbfe67b1dd705412d397d6b2c2506b3636c0bbf:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
3e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e50: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a  _CONCURRENT./*.*
3e60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3e70: 73 74 72 75 63 74 75 72 65 20 2d 20 42 74 72 65  structure - Btre
3e80: 65 50 74 72 6d 61 70 20 2d 20 73 74 6f 72 65 73  ePtrmap - stores
3e90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
3ea0: 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 75 73  ointer map.** us
3eb0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 20 61 6c 6c  ed for newly all
3ec0: 6f 63 61 74 65 64 20 70 61 67 65 73 20 69 6e 20  ocated pages in 
3ed0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
3ee0: 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70 61  actions. Such pa
3ef0: 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  ges are.** alway
3f00: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
3f10: 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
3f20: 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  k (from the end 
3f30: 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73 74 61  of the file) sta
3f40: 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 70 61  rting.** with pa
3f50: 67 65 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69  ge BtreePtrmap.i
3f60: 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  First..*/.typede
3f70: 66 20 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63  f struct Rollbac
3f80: 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45  kEntry RollbackE
3f90: 6e 74 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74  ntry;.typedef st
3fa0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fb0: 20 50 74 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74   PtrmapEntry;.st
3fc0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fd0: 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74   {.  Pgno parent
3fe0: 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b  ;.  u8 eType;.};
3ff0: 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b  .struct Rollback
4000: 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70  Entry {.  Pgno p
4010: 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65  gno;.  Pgno pare
4020: 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a  nt;.  u8 eType;.
4030: 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65 65 50  };.struct BtreeP
4040: 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69  trmap {.  Pgno i
4050: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
4060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4070: 73 74 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62  st new page numb
4080: 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20  er aPtr[0] */.. 
4090: 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20   int nPtrAlloc; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
40c0: 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72  ze of aPtr[] arr
40d0: 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e  ay */.  PtrmapEn
40e0: 74 72 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20  try *aPtr;      
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4100: 20 6f 66 20 70 61 72 65 6e 74 20 70 61 67 65 20   of parent page 
4110: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e  numbers */..  in
4120: 74 20 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20  t nSvpt;        
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4140: 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53   Used size of aS
4150: 76 70 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vpt[] array */. 
4160: 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b   int nSvptAlloc;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
4190: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f  ze of aSvpt[] */
41a0: 0a 20 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20  .  int *aSvpt;  
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c     /* First aRol
41d0: 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f  lback[] entry fo
41e0: 72 20 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f  r savepoint i */
41f0: 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63  ..  int nRollbac
4200: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
4210: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65      /* Used size
4220: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
4230: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20  RollbackAlloc;  
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4260: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4270: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
4280: 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45  y */.  RollbackE
4290: 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b  ntry *aRollback;
42a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
42b0: 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72  of rollback entr
42c0: 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64  ies */.};../* !d
42d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
42e0: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
42f0: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
4300: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
4310: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4320: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
4330: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
4340: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
4350: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
4360: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4380: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
4390: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
43a0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
43b0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
43c0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
43d0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
43e0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
43f0: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4400: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4410: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4420: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4430: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4440: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4460: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4470: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4480: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
4490: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
44a0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
44b0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
44c0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
44d0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
44e0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
44f0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4500: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4510: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4520: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4530: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4550: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4570: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4580: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
4590: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
45a0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
45b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
45c0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
45d0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
45e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
45f0: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4600: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4610: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4620: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4630: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4640: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4650: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4660: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4670: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4680: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
4690: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
46a0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
46b0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
46c0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
46d0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
46e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
46f0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4700: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4710: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4720: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4730: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4740: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4750: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4760: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4770: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4780: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
4790: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
47a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
47c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
47d0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
47e0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
47f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4800: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4810: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4830: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4840: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4850: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4860: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4870: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4880: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
4890: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
48a0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
48b0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
48c0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
48d0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
48e0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
48f0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4900: 6f 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ollback++;.    }
4910: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
4920: 74 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79  the aPtr[] array
4930: 20 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50   */.    pMap->aP
4940: 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e  tr[iEntry].paren
4950: 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20  t = parent;.    
4960: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4970: 79 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65  y].eType = eType
4980: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
49a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
49b0: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
49c0: 29 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76  ).**.** Open sav
49d0: 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
49e0: 74 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  t, if it is not 
49f0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f  already open..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4a10: 65 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53  ePtrmapBegin(BtS
4a20: 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
4a30: 6e 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  nSvpt){.  BtreeP
4a40: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4a50: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4a60: 4d 61 70 20 26 26 20 6e 53 76 70 74 3e 70 4d 61  Map && nSvpt>pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
4a90: 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70  Svpt>=pMap->nSvp
4aa0: 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  tAlloc ){.      
4ab0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4ac0: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d  >nSvptAlloc ? pM
4ad0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32  ap->nSvptAlloc*2
4ae0: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74   : 16;.      int
4af0: 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *aNew = sqlite3
4b00: 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61  _realloc(pMap->a
4b10: 53 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Svpt, sizeof(int
4b20: 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  ) * nNew);.     
4b30: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4b40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4b50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b70: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20    pMap->aSvpt = 
4b80: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4b90: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d  ap->nSvptAlloc =
4ba0: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4bb0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
4bc0: 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e  pMap->nSvpt; i<n
4bd0: 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Svpt; i++){.    
4be0: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d    pMap->aSvpt[i]
4bf0: 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61   = pMap->nRollba
4c00: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  ck;.    }.    pM
4c10: 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70  ap->nSvpt = nSvp
4c20: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
4c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4c40: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4c50: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4c60: 54 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  T).**.** Rollbac
4c70: 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f  k (if op==SAVEPO
4c80: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72  INT_ROLLBACK) or
4c90: 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d   release (if op=
4ca0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4cb0: 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  SE).** savepoint
4cc0: 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   iSvpt..*/.stati
4cd0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d  c void btreePtrm
4ce0: 61 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a  apEnd(BtShared *
4cf0: 70 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  pBt, int op, int
4d00: 20 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65   iSvpt){.  Btree
4d10: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
4d20: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4d30: 70 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  pMap ){.    asse
4d40: 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
4d50: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70  T_ROLLBACK || op
4d60: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4d70: 41 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ASE );.    asser
4d80: 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28  t( iSvpt>=0 || (
4d90: 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  iSvpt==-1 && op=
4da0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
4db0: 41 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ACK) );.    if( 
4dc0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20  iSvpt<0 ){.     
4dd0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30   pMap->nSvpt = 0
4de0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4df0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
4e00: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e     memset(pMap->
4e10: 61 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aPtr, 0, sizeof(
4e20: 50 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50  Pgno) * pMap->nP
4e30: 74 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65  trAlloc);.    }e
4e40: 6c 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d  lse if( iSvpt<pM
4e50: 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20  ap->nSvpt ){.   
4e60: 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
4e70: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
4e80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4e90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
4ea0: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d  pMap->nRollback-
4eb0: 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76  1; ii>=pMap->aSv
4ec0: 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29  pt[iSvpt]; ii--)
4ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c  {.          Roll
4ee0: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4ef0: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4f00: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ii];.          P
4f10: 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
4f20: 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72  ry = &pMap->aPtr
4f30: 5b 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d  [p->pgno - pMap-
4f40: 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  >iFirst];.      
4f50: 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65      pEntry->pare
4f60: 6e 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a  nt = p->parent;.
4f70: 20 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79            pEntry
4f80: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
4f90: 70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pe;.        }.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70      }.      pMap
4fb0: 2d 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20  ->nSvpt = iSvpt 
4fc0: 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
4fd0: 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
4fe0: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4ff0: 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b  k = pMap->aSvpt[
5000: 69 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20  iSvpt];.    }.  
5010: 7d 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64  }.}../* !defined
5020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e  (SQLITE_OMIT_CON
5030: 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54  CURRENT).**.** T
5040: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5050: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
5060: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
5070: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
5080: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
5090: 61 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65  ase. It allocate
50a0: 73 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  s the BtreePtrma
50b0: 70 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  p structure used
50c0: 20 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65   to track pointe
50d0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  rs.** to allocat
50e0: 65 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72  ed pages and zer
50f0: 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
5100: 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
5110: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
5120: 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31  header on page 1
5130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5140: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5150: 61 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ate(BtShared *pB
5160: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5170: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5180: 70 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a  pBt->pMap==0 ){.
5190: 20 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20      BtreePtrmap 
51a0: 2a 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f  *pMap = sqlite3_
51b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  malloc(sizeof(Bt
51c0: 72 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20  reePtrmap));.   
51d0: 20 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a   if( pMap==0 ){.
51e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
51f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
5210: 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
5220: 44 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a  Data[32], 0, siz
5230: 65 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20  eof(u32)*2);.   
5240: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20     memset(pMap, 
5250: 30 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50  0, sizeof(BtreeP
5260: 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70  trmap));.      p
5270: 4d 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42  Map->iFirst = pB
5280: 74 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20  t->nPage + 1;.  
5290: 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
52a0: 70 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pMap;.    }.  }.
52b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
52e0: 4e 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61  NT).**.** Free a
52f0: 6e 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73  ny BtreePtrmap s
5300: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
5310: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
5320: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65   call to.** btre
5330: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
5340: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5350: 64 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c  d btreePtrmapDel
5360: 65 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ete(BtShared *pB
5370: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
5380: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
5390: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
53a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
53b0: 72 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62  ree(pMap->aRollb
53c0: 61 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ack);.    sqlite
53d0: 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74  3_free(pMap->aPt
53e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
53f0: 66 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74  free(pMap->aSvpt
5400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5410: 72 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70  ree(pMap);.    p
5420: 42 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20  Bt->pMap = 0;.  
5430: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  }.}../*.** Check
5440: 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
5450: 72 2d 6d 61 70 20 64 6f 65 73 20 6e 6f 74 20 63  r-map does not c
5460: 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69  ontain any entri
5470: 65 73 20 77 69 74 68 20 61 20 70 61 72 65 6e 74  es with a parent
5480: 0a 2a 2a 20 70 61 67 65 20 6f 66 20 30 2e 20 43  .** page of 0. C
5490: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
54a0: 29 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  ) multiple times
54b0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 65   to output the e
54c0: 6e 74 69 72 65 0a 2a 2a 20 64 61 74 61 20 73 74  ntire.** data st
54d0: 72 75 63 74 75 72 65 20 69 66 20 69 74 20 64 6f  ructure if it do
54e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
54f0: 69 64 20 62 74 72 65 65 50 74 72 6d 61 70 43 68  id btreePtrmapCh
5500: 65 63 6b 28 42 74 53 68 61 72 65 64 20 2a 70 42  eck(BtShared *pB
5510: 74 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  t, Pgno nPage){.
5520: 20 20 50 67 6e 6f 20 69 3b 0a 20 20 69 6e 74 20    Pgno i;.  int 
5530: 62 50 72 6f 62 6c 65 6d 20 3d 20 30 3b 0a 20 20  bProblem = 0;.  
5540: 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 20 3d  BtreePtrmap *p =
5550: 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 0a 20 20 66   pBt->pMap;..  f
5560: 6f 72 28 69 3d 70 2d 3e 69 46 69 72 73 74 3b 20  or(i=p->iFirst; 
5570: 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
5580: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
5590: 2a 70 45 6e 74 72 79 20 3d 20 26 70 2d 3e 61 50  *pEntry = &p->aP
55a0: 74 72 5b 69 2d 70 2d 3e 69 46 69 72 73 74 5d 3b  tr[i-p->iFirst];
55b0: 0a 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d  .    if( pEntry-
55c0: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f  >eType==PTRMAP_O
55d0: 56 45 52 46 4c 4f 57 31 0a 20 20 20 20 20 7c 7c  VERFLOW1.     ||
55e0: 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d   pEntry->eType==
55f0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
5600: 0a 20 20 20 20 20 7c 7c 20 70 45 6e 74 72 79 2d  .     || pEntry-
5610: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42  >eType==PTRMAP_B
5620: 54 52 45 45 0a 20 20 20 20 29 7b 0a 20 20 20 20  TREE.    ){.    
5630: 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 70 61    if( pEntry->pa
5640: 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
5650: 20 20 20 62 50 72 6f 62 6c 65 6d 20 3d 20 31 3b     bProblem = 1;
5660: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5680: 7d 0a 0a 20 20 69 66 28 20 62 50 72 6f 62 6c 65  }..  if( bProble
5690: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  m ){.    for(i=p
56a0: 2d 3e 69 46 69 72 73 74 3b 20 69 3c 3d 6e 50 61  ->iFirst; i<=nPa
56b0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
56c0: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e  PtrmapEntry *pEn
56d0: 74 72 79 20 3d 20 26 70 2d 3e 61 50 74 72 5b 69  try = &p->aPtr[i
56e0: 2d 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20  -p->iFirst];.   
56f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5700: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 0a  QLITE_CORRUPT, .
5710: 20 20 20 20 20 20 20 20 20 20 22 62 74 72 65 65            "btree
5720: 50 74 72 6d 61 70 43 68 65 63 6b 3a 20 70 67 6e  PtrmapCheck: pgn
5730: 6f 3d 25 64 20 65 54 79 70 65 3d 25 64 20 70 61  o=%d eType=%d pa
5740: 72 65 6e 74 3d 25 64 22 2c 20 0a 20 20 20 20 20  rent=%d", .     
5750: 20 20 20 20 20 28 69 6e 74 29 69 2c 20 28 69 6e       (int)i, (in
5760: 74 29 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c  t)pEntry->eType,
5770: 20 28 69 6e 74 29 70 45 6e 74 72 79 2d 3e 70 61   (int)pEntry->pa
5780: 72 65 6e 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  rent.      );.  
5790: 20 20 7d 0a 20 20 20 20 61 62 6f 72 74 28 29 3b    }.    abort();
57a0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 20 20 2f  .  }.}..#else  /
57b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
57c0: 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 23 20 64 65  NCURRENT */.# de
57d0: 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70  fine btreePtrmap
57e0: 41 6c 6c 6f 63 61 74 65 28 78 29 20 53 51 4c 49  Allocate(x) SQLI
57f0: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62  TE_OK.# define b
5800: 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65  treePtrmapDelete
5810: 28 78 29 20 0a 23 20 64 65 66 69 6e 65 20 62 74  (x) .# define bt
5820: 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 78  reePtrmapBegin(x
5830: 2c 79 29 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  ,y)  SQLITE_OK.#
5840: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5850: 6d 61 70 45 6e 64 28 78 2c 79 2c 7a 29 20 0a 23  mapEnd(x,y,z) .#
5860: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5870: 6d 61 70 43 68 65 63 6b 28 79 2c 7a 29 20 0a 23  mapCheck(y,z) .#
5880: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5890: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20  OMIT_CONCURRENT 
58a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
58b0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
58c0: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
58d0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
58e0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
58f0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
5900: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
5910: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
5920: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5930: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
5940: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
5950: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
5960: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5970: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
5980: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5990: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
59a0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
59b0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
59c0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
59d0: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
59e0: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
59f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5a00: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5a10: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
5a20: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
5a30: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5a40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
5a50: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
5a60: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
5a70: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
5a80: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
5a90: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
5aa0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
5ab0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
5ac0: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
5ad0: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
5ae0: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
5af0: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
5b00: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
5b10: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
5b20: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
5b30: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
5b40: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
5b50: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
5b60: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
5b70: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
5b80: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
5b90: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
5ba0: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
5bb0: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
5bc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5bd0: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
5be0: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
5bf0: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
5c00: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
5c10: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
5c20: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
5c30: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
5c40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5c50: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
5c60: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
5c70: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
5c80: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
5c90: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
5ca0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5cb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
5cc0: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
5cd0: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
5ce0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5cf0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
5d00: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
5d10: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
5d20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
5d30: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
5d40: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
5d50: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
5d60: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
5d70: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5d80: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
5d90: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
5da0: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
5db0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
5dc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
5dd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
5de0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
5df0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
5e00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
5e10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
5e20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
5e30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
5e40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
5e50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5e70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5e80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5e90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
5ea0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
5eb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
5ec0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
5ed0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
5ee0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
5ef0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
5f00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
5f10: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
5f20: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
5f30: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
5f40: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
5f50: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
5f60: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
5f70: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
5f80: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
5f90: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
5fa0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
5fb0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
5fc0: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
5fd0: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
5fe0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
5ff0: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
6000: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
6010: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
6020: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
6030: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
6040: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
6050: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
6060: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
6070: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
6080: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
6090: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
60a0: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
60b0: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
60c0: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
60d0: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
60e0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
60f0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
6100: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
6110: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
6120: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
6130: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
6140: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
6150: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6160: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
6170: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
6180: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
6190: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
61a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
61b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
61c0: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
61d0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
61e0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
61f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6200: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
6210: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
6220: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
6230: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
6240: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
6250: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
6260: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
6270: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
6280: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
6290: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
62a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
62b0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
62c0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
62d0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
62e0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
62f0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
6300: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
6310: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
6320: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
6330: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
6340: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
6350: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
6360: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
6370: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
6380: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
6390: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
63a0: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
63b0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
63c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
63d0: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
63e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
63f0: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
6400: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
6410: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
6420: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
6430: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6440: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
6450: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6460: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
6470: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
6480: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
6490: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
64a0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
64b0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
64c0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
64d0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
64e0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
64f0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
6500: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
6510: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
6520: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
6530: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
6540: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
6550: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
6560: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
6570: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
6580: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
6590: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
65a0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
65b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
65c0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
65d0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
65e0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
65f0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
6600: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
6610: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
6620: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
6630: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
6640: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
6650: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
6660: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
6670: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
6680: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
6690: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
66a0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
66b0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
66c0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
66d0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
66e0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
66f0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
6700: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
6710: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
6720: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
6730: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
6740: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
6750: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
6760: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
6770: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
6780: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
6790: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
67a0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
67b0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
67c0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
67d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
67e0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
67f0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
6800: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
6810: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
6820: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
6830: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
6840: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
6850: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
6860: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
6870: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
6880: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
6890: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
68a0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
68b0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
68c0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
68d0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
68e0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
68f0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
6900: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
6910: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
6920: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
6930: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
6940: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
6950: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
6960: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
6970: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
6980: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
6990: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
69a0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
69b0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
69c0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
69d0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
69e0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
69f0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6a00: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
6a10: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
6a20: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
6a30: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
6a40: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
6a50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
6a60: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
6a70: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
6a80: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
6a90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6aa0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
6ab0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
6ac0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
6ad0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
6ae0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
6af0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
6b00: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
6b10: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
6b20: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
6b30: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
6b40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
6b50: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6b70: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
6b80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b90: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
6ba0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6bb0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
6bc0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
6bd0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
6be0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
6bf0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
6c00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
6c10: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
6c20: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
6c30: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
6c40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6c50: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
6c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6c80: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
6c90: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
6ca0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
6cc0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
6cd0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
6ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
6d00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
6d10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
6d20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
6d30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6d40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
6d50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
6d60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
6d70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
6d80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
6d90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
6da0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
6db0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
6dc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
6dd0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
6de0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
6df0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
6e00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6e10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
6e20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
6e30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
6e40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
6e50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
6e60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
6e70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
6e80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
6e90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
6ea0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
6eb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
6ec0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
6ed0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
6ee0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
6ef0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
6f00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
6f10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
6f20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
6f30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
6f40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
6f50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
6f60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
6f70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
6f80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
6f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
6fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
6fb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
6fc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
6fd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
6fe0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
6ff0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
7000: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
7010: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
7020: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
7030: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
7040: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
7050: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
7060: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
7070: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
7080: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
7090: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
70a0: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
70b0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
70c0: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
70d0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
70e0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
70f0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
7100: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
7110: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
7120: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
7130: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
7140: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
7150: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
7160: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
7170: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
7180: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
7190: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
71a0: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
71b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
71c0: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
71d0: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
71e0: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
71f0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
7200: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
7210: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
7220: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
7230: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
7240: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
7250: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
7260: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
7270: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
7280: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
7290: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
72a0: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
72b0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
72c0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
72d0: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
72e0: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
72f0: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
7300: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
7310: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
7320: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
7330: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
7340: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7350: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7360: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
7370: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
7380: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
7390: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
73a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
73b0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
73c0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
73d0: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
73e0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
73f0: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
7400: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
7410: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
7420: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
7430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
7440: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
7450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
7460: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
7470: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
7480: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
7490: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
74a0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
74b0: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
74c0: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
74d0: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
74e0: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
74f0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
7500: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
7510: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
7520: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
7530: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
7540: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
7550: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
7560: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
7570: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
7580: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
7590: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
75a0: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
75b0: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
75c0: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
75d0: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
75e0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
75f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7600: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
7610: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
7620: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
7630: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
7640: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
7650: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7660: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
7670: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
7680: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
7690: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
76a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
76c0: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
76d0: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
76e0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
76f0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
7700: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7710: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
7720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7730: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
7740: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
7750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
7760: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
7770: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
7780: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
7790: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
77a0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
77b0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
77c0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
77d0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
77e0: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
77f0: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
7800: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
7810: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
7820: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
7830: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
7840: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
7850: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
7860: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
7870: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
7880: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
7890: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
78a0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
78b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
78c0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
78d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
78e0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
78f0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
7900: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
7910: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
7920: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
7930: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
7940: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
7950: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
7960: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
7970: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
7980: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
7990: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
79a0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
79b0: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
79c0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
79d0: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
79e0: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
79f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7a00: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
7a10: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
7a20: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
7a30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7a40: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
7a50: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
7a60: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
7a70: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
7a80: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
7a90: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
7aa0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
7ab0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
7ac0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
7ad0: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
7ae0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
7af0: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
7b00: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
7b10: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
7b20: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
7b30: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
7b40: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
7b50: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
7b60: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
7b70: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
7b80: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
7b90: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
7ba0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
7bb0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
7bc0: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
7bd0: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
7be0: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
7bf0: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
7c00: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
7c10: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
7c20: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
7c30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7c40: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
7c50: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
7c60: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
7c70: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
7c80: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
7c90: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
7ca0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
7cb0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
7cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
7cd0: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
7ce0: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
7cf0: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
7d00: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
7d10: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
7d20: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
7d30: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
7d40: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
7d50: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
7d60: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
7d70: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
7d80: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
7d90: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
7da0: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
7db0: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
7dc0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
7dd0: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
7de0: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
7df0: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
7e00: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
7e10: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
7e20: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
7e30: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
7e40: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
7e50: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
7e60: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
7e70: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
7e80: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
7e90: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
7ea0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
7eb0: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
7ec0: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
7ed0: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
7ee0: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
7ef0: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
7f00: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
7f10: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
7f20: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
7f30: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
7f40: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
7f50: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
7f60: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
7f70: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
7f80: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
7f90: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
7fa0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
7fb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7fc0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7fd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
7fe0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
7ff0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
8000: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
8010: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
8020: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
8030: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8040: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8050: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
8060: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
8070: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
8080: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
8090: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
80a0: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
80b0: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
80c0: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
80d0: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
80e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
80f0: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
8100: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
8110: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
8120: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
8130: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
8140: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
8150: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
8160: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
8170: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
8180: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
8190: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
81a0: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
81b0: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
81c0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
81d0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
81e0: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
81f0: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
8200: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
8210: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
8220: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
8230: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
8240: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
8250: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
8260: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
8270: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
8280: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
8290: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
82a0: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
82b0: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
82c0: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
82d0: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
82e0: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
82f0: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
8300: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
8310: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
8320: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8330: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8340: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
8350: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
8360: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
8370: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
8380: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
8390: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
83a0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
83b0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
83c0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
83d0: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
83e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
83f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
8400: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
8410: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
8420: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
8430: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
8440: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
8450: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
8460: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
8470: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
8480: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8490: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
84a0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
84b0: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
84c0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
84d0: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
84e0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
84f0: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
8500: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
8510: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8520: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
8530: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
8540: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
8550: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
8560: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
8570: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
8580: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
8590: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
85a0: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
85b0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
85c0: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
85d0: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
85e0: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
85f0: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
8600: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
8610: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
8620: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
8630: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
8640: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
8650: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
8660: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
8670: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
8680: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
8690: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
86a0: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
86b0: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
86c0: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
86d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
86e0: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
86f0: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
8700: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
8710: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
8720: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
8730: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
8740: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
8750: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
8760: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
8770: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
8780: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
87b0: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
87c0: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
87d0: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
87e0: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
87f0: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
8800: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
8810: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
8820: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
8830: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
8840: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
8850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
8860: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
8870: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
8880: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
8890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
88a0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
88b0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
88c0: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
88d0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
88e0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
88f0: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
8900: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
8910: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
8920: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
8930: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8940: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8950: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
8960: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
8970: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
8980: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
8990: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
89a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
89b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
89c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
89d0: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
89e0: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
89f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8a00: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
8a10: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
8a20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8a30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
8a40: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
8a50: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
8a60: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
8a70: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
8a80: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
8a90: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
8aa0: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
8ab0: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
8ac0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
8ad0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
8ae0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
8af0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8b00: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
8b10: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
8b20: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
8b30: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
8b40: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
8b50: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
8b60: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
8b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
8b80: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
8b90: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
8ba0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
8bb0: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
8bc0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
8bd0: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
8be0: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
8bf0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
8c00: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
8c10: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
8c20: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
8c30: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
8c40: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
8c50: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
8c60: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
8c70: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
8c80: 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c 74  if( sqlite3Fault
8c90: 53 69 6d 28 34 31 30 29 20 29 7b 0a 20 20 20 20  Sim(410) ){.    
8ca0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
8cb0: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
8cc0: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
8cd0: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
8ce0: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
8cf0: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
8d00: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
8d10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
8d20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
8d30: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
8d40: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
8d50: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
8d60: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
8d70: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
8d80: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
8d90: 44 20 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69  D );.    if( ski
8da0: 70 4e 65 78 74 20 29 20 70 43 75 72 2d 3e 73 6b  pNext ) pCur->sk
8db0: 69 70 4e 65 78 74 20 3d 20 73 6b 69 70 4e 65 78  ipNext = skipNex
8dc0: 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  t;.    if( pCur-
8dd0: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
8de0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
8df0: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
8e00: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
8e10: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
8e20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8e30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
8e40: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
8e50: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
8e60: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
8e70: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
8e80: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
8e90: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
8ea0: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
8eb0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
8ec0: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
8ed0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
8ee0: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
8ef0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
8f00: 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  sition where.** 
8f10: 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  it was last plac
8f20: 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20  ed, or has been 
8f30: 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20  invalidated for 
8f40: 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  any other reason
8f50: 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e  ..** Cursors can
8f60: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
8f70: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
8f80: 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74  ting at is delet
8f90: 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75  ed out.** from u
8fa0: 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65  nder them, for e
8fb0: 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20  xample.  Cursor 
8fc0: 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20  might also move 
8fd0: 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73  if a btree.** is
8fe0: 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a   rebalanced..**.
8ff0: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
9000: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e  routine with a N
9010: 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  ULL cursor point
9020: 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  er returns false
9030: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
9040: 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33  separate sqlite3
9050: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
9060: 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20  re() routine to 
9070: 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72  restore a cursor
9080: 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72  .** back to wher
9090: 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  e it ought to be
90a0: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
90b0: 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a   returns true..*
90c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
90d0: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
90e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
90f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
9100: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
9110: 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c 7c  (pCur).       ||
9120: 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42 74   pCur==sqlite3Bt
9130: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
9140: 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  or() );.  assert
9150: 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  ( offsetof(BtCur
9160: 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30 20  sor, eState)==0 
9170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
9180: 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74 65  eof(pCur->eState
9190: 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==1 );.  return
91a0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21 3d   CURSOR_VALID !=
91b0: 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a 0a   *(u8*)pCur;.}..
91c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
91d0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b 65  ointer to a fake
91e0: 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
91f0: 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61 79   that will alway
9200: 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c 73  s answer.** fals
9210: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  e to the sqlite3
9220: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
9230: 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61 62  ved() routine ab
9240: 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a 2a  ove.  The fake.*
9250: 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e 65  * cursor returne
9260: 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
9270: 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
9280: 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61 63  r Btree interfac
9290: 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20 2a  e..*/.BtCursor *
92a0: 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65  sqlite3BtreeFake
92b0: 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69 64  ValidCursor(void
92c0: 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20 66  ){.  static u8 f
92d0: 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52 53  akeCursor = CURS
92e0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73 65  OR_VALID;.  asse
92f0: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43  rt( offsetof(BtC
9300: 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d  ursor, eState)==
9310: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 42  0 );.  return (B
9320: 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43 75  tCursor*)&fakeCu
9330: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
9340: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
9350: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
9360: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
9370: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
9380: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
9390: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
93a0: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
93b0: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
93c0: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
93d0: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
93e0: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
93f0: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
9400: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
9410: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
9420: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
9430: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
9440: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
9450: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
9460: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
9470: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
9480: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
9490: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
94a0: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
94b0: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
94c0: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
94d0: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
94e0: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
94f0: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
9500: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
9510: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
9520: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
9530: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
9540: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
9550: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
9560: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
9570: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
9580: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
9590: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
95a0: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
95b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
95c0: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
95d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
95e0: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
95f0: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
9600: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
9610: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
9620: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
9630: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
9640: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
9650: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
9660: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
9670: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
9680: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
9690: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
96a0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
96b0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
96c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
96d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
96e0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
96f0: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
9700: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
9710: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
9720: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
9730: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
9740: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
9750: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
9760: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
9770: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
9780: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
9790: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
97a0: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
97b0: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
97c0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
97d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
97e0: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
97f0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
9800: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
9810: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
9820: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
9830: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
9840: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
9850: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
9860: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
9870: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
9880: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
9890: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
98a0: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
98b0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
98c0: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
98d0: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
98e0: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
98f0: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
9900: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
9910: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
9920: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9930: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
9940: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
9950: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
9960: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
9970: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
9980: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
9990: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
99a0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
99b0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
99c0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
99d0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
99e0: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
99f0: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
9a00: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
9a10: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
9a20: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
9a30: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
9a40: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
9a50: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
9a60: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
9a70: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
9a80: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
9a90: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
9aa0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
9ab0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
9ac0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
9ad0: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
9ae0: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
9af0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9b00: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
9b10: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
9b20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
9b30: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
9b40: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
9b50: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
9b60: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
9b70: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
9b80: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
9b90: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
9ba0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
9bb0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
9bc0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
9bd0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
9be0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
9bf0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
9c00: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
9c10: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
9c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
9c30: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
9c40: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
9c50: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
9c60: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
9c70: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
9c80: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
9c90: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
9ca0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
9cb0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
9cc0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
9cd0: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
9ce0: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
9cf0: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
9d00: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
9d10: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
9d20: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
9d30: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
9d40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
9d50: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
9d60: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
9d70: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
9d80: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
9d90: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
9da0: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
9db0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
9dc0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
9dd0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
9de0: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
9df0: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
9e00: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
9e10: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
9e20: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
9e30: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
9e40: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
9e50: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
9e60: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9e70: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
9e80: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
9e90: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
9ea0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
9eb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9ec0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
9ed0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
9ee0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
9ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6e  page number is n
9f00: 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 61 20  ever added to a 
9f10: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
9f20: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
9f30: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
9f40: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
9f50: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
9f60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9f70: 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  MIT_CONCURRENT. 
9f80: 20 69 66 28 20 70 42 74 2d 3e 70 4d 61 70 20 29   if( pBt->pMap )
9f90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 62 74 72  {.    *pRC = btr
9fa0: 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28 70 42  eePtrmapStore(pB
9fb0: 74 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  t, key, eType, p
9fc0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 72 65 74 75  arent);.    retu
9fd0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
9fe0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
9ff0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
a000: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
a010: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
a020: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a030: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
a040: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
a050: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
a060: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a070: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
a080: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
a090: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
a0a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a0b0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
a0c0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
a0d0: 20 7d 0a 20 20 69 66 28 20 28 28 63 68 61 72 2a   }.  if( ((char*
a0e0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
a0f0: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 29 5b  Extra(pDbPage))[
a100: 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  0]!=0 ){.    /* 
a110: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
a120: 66 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  f the extra data
a130: 20 69 73 20 74 68 65 20 4d 65 6d 50 61 67 65 2e   is the MemPage.
a140: 69 73 49 6e 69 74 20 62 79 74 65 2e 0a 20 20 20  isInit byte..   
a150: 20 2a 2a 20 49 66 20 74 68 61 74 20 62 79 74 65   ** If that byte
a160: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
a170: 73 20 74 68 69 73 20 70 61 67 65 20 69 73 20 61  s this page is a
a180: 6c 73 6f 20 62 65 69 6e 67 20 75 73 65 64 0a 20  lso being used. 
a190: 20 20 20 2a 2a 20 61 73 20 61 20 62 74 72 65 65     ** as a btree
a1a0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 2a 70   page. */.    *p
a1b0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
a1c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
a1d0: 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a  to ptrmap_exit;.
a1e0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
a1f0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
a200: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
a210: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
a220: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
a230: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a240: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
a250: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
a260: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
a270: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
a280: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
a290: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
a2a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
a2b0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
a2c0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
a2d0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
a2e0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
a2f0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
a300: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
a310: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
a320: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
a330: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
a340: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
a350: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
a360: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
a370: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a380: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
a390: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
a3a0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
a3b0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
a3c0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
a3d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
a3e0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
a3f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
a400: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
a410: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
a420: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
a430: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
a440: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
a450: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
a460: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
a470: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
a480: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
a490: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
a4a0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
a4b0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
a4c0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
a4d0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
a4e0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
a4f0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
a500: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
a510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a520: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
a530: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
a540: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
a550: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
a560: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
a570: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
a580: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
a590: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
a5a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
a5b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
a5c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
a5d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
a5e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
a5f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
a600: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
a610: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
a620: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
a630: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
a640: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a650: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
a660: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
a670: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
a680: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
a690: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
a6a0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
a6b0: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
a6c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a6d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
a6e0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
a6f0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
a700: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
a710: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
a720: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
a730: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
a740: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
a750: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
a760: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
a770: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
a780: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a790: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a7a0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
a7b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
a7c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
a7d0: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
a7e0: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
a7f0: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
a800: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
a810: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
a820: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
a830: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
a840: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
a850: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
a860: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
a870: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a880: 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a  _PGNO(iPtrmap);.
a890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a8a0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
a8b0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
a8c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
a8d0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
a8e0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
a8f0: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
a900: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
a910: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
a920: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
a930: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 7a 2c 20  vflPtr(x, y, z, 
a940: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
a950: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
a960: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
a970: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
a980: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
a990: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
a9a0: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
a9b0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
a9c0: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
a9d0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
a9e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
a9f0: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
aa00: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
aa10: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
aa20: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
aa30: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
aa40: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
aa50: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
aa60: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
aa70: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
aa80: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
aa90: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
aaa0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
aab0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
aac0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
aad0: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
aae0: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
aaf0: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
ab00: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
ab10: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
ab20: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
ab30: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
ab40: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
ab50: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
ab60: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
ab70: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
ab80: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
ab90: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
aba0: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
abb0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
abc0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
abd0: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
abe0: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
abf0: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
ac00: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
ac10: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
ac20: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
ac30: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
ac40: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
ac50: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
ac60: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
ac70: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
ac80: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
ac90: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
aca0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
acb0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
acc0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
acd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
ace0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
acf0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
ad00: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
ad10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
ad20: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
ad30: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
ad40: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
ad50: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
ad60: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
ad70: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
ad80: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
ad90: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
ada0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
adb0: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
adc0: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
add0: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
ade0: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
adf0: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
ae00: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
ae10: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
ae20: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
ae30: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
ae40: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
ae50: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
ae60: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
ae70: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
ae80: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
ae90: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
aea0: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
aeb0: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
aec0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
aed0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
aee0: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
aef0: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
af00: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
af10: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
af20: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
af30: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
af40: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
af50: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
af60: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
af70: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
af80: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
af90: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
afa0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
afb0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
afc0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
afd0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
afe0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
aff0: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
b000: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
b010: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
b020: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
b030: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
b040: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
b050: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
b060: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
b070: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
b080: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
b090: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
b0a0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
b0b0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
b0c0: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
b0d0: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
b0e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
b0f0: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
b100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b110: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
b120: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
b130: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  }.  pInfo->nSize
b140: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
b150: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
b160: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
b170: 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) + 4;.}../*.** 
b180: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
b190: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
b1a0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
b1b0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
b1c0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
b1d0: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
b1e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
b1f0: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
b200: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
b210: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
b220: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
b230: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
b240: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
b250: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
b260: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
b270: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
b280: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
b290: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
b2a0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
b2b0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
b2c0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
b2d0: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
b2e0: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
b2f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
b300: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
b310: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
b320: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
b330: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
b340: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
b350: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
b360: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b370: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
b380: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
b390: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
b3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
b3b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
b3c0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
b3d0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
b3e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
b3f0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
b400: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
b410: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
b420: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
b430: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
b440: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b450: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b460: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b470: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b480: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
b490: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
b4a0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
b4b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
b4c0: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
b4d0: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
b4e0: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
b4f0: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
b500: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
b510: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
b520: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
b530: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
b540: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
b550: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
b560: 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ad = 0;.  return
b570: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
b580: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
b590: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
b5a0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
b5b0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
b5c0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
b5d0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
b5e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
b5f0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
b600: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
b610: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
b620: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
b630: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
b640: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
b650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
b660: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
b670: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
b680: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
b690: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b6a0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
b6b0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34  payload */.  u64
b6c0: 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
b6d0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65       /* Extracte
b6e0: 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a  d Key value */..
b6f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b700: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
b710: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
b720: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b730: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
b740: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
b750: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b760: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
b770: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b780: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
b790: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
b7a0: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
b7b0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
b7c0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
b7d0: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
b7e0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
b7f0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
b800: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
b810: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
b820: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
b830: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
b840: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
b850: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
b860: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
b870: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
b880: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
b890: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
b8a0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
b8b0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
b8c0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
b8d0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
b8e0: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
b8f0: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
b900: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
b910: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
b920: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
b930: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
b940: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
b950: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
b960: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
b970: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
b980: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
b990: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
b9a0: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
b9b0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
b9c0: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
b9d0: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
b9e0: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
b9f0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
ba00: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
ba10: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
ba20: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
ba30: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
ba40: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
ba50: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
ba60: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
ba70: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
ba80: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
ba90: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
baa0: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
bab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bac0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bad0: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
bae0: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
baf0: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
bb00: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
bb10: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
bb20: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
bb30: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
bb40: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
bb50: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
bb60: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
bb70: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
bb80: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
bb90: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
bba0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
bbb0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
bbc0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
bbd0: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
bbe0: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
bbf0: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
bc00: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
bc10: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
bc20: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
bc30: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
bc40: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
bc50: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
bc60: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
bc70: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
bc80: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
bc90: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
bca0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
bcb0: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
bcc0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
bcd0: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
bce0: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
bcf0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
bd00: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
bd10: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
bd20: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
bd30: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
bd40: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
bd50: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
bd80: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
bd90: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
bda0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
bdb0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
bdc0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
bdd0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
bde0: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
bdf0: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
be00: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
be10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
be20: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
be30: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
be40: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
be50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
be60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
be70: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
be80: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
be90: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
bea0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
beb0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
bec0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
bed0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
bee0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
bef0: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
bf00: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
bf10: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
bf20: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
bf30: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
bf40: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
bf50: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
bf60: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
bf70: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
bf80: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
bf90: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
bfa0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
bfb0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
bfc0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
bfd0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
bfe0: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
bff0: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
c000: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
c010: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
c020: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
c030: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
c040: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
c050: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
c060: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
c070: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
c080: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
c090: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
c0a0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
c0b0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
c0c0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
c0d0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
c0e0: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
c0f0: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
c100: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
c110: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
c120: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
c130: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
c140: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
c150: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
c160: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
c170: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
c180: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
c190: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
c1a0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
c1b0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
c1c0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
c1d0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
c1e0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
c1f0: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
c200: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
c210: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
c220: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
c230: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
c240: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
c250: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
c260: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
c270: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
c280: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
c290: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
c2a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  re */.){.  pPage
c2b0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
c2c0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
c2d0: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
c2e0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
c2f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
c300: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
c310: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
c320: 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65  emPage.xCellSize
c330: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
c340: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
c350: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
c360: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
c370: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
c380: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
c390: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
c3a0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
c3b0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
c3c0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
c3d0: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
c3e0: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
c3f0: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
c400: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
c410: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
c420: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
c430: 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  .**.** cellSizeP
c440: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20  trNoPayload()   
c450: 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65   =>   table inte
c460: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65  rnal nodes.** ce
c470: 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20  llSizePtr()     
c480: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c          =>   all
c490: 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74   index nodes & t
c4a0: 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  able leaf nodes.
c4b0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
c4c0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
c4d0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
c4e0: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
c4f0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
c500: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
c510: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
c520: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
c530: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
c540: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
c570: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
c580: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c5b0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
c5c0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
c5d0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
c5e0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c5f0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
c600: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
c610: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
c620: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
c630: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
c640: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
c650: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
c660: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
c670: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
c680: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c690: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
c6a0: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
c6b0: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
c6c0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
c6d0: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
c6e0: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
c6f0: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
c700: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
c710: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
c720: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
c730: 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d  endif..  nSize =
c740: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
c750: 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20  Size>=0x80 ){.  
c760: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
c770: 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d  8];.    nSize &=
c780: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
c790: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53       nSize = (nS
c7a0: 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  ize<<7) | (*++pI
c7b0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
c7c0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
c7d0: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
c7e0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
c7f0: 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50  Iter++;.  if( pP
c800: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
c810: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
c820: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
c830: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
c840: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
c850: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
c860: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
c870: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
c880: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
c890: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
c8a0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
c8b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
c8c0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
c8d0: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
c8e0: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
c8f0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
c900: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
c910: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
c920: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
c930: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
c940: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
c950: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
c960: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d  );.  if( nSize<=
c970: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c980: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20  ){.    nSize += 
c990: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
c9a0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ell);.    if( nS
c9b0: 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20  ize<4 ) nSize = 
c9c0: 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
c9d0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
c9e0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
c9f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
ca00: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
ca10: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
ca20: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ca30: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
ca40: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
ca50: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
ca60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ca70: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
ca80: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
ca90: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
caa0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
cab0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
cac0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
cad0: 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36  Size += 4 + (u16
cae0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
caf0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
cb00: 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f  nSize==debuginfo
cb10: 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  .nSize || CORRUP
cb20: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
cb30: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73   (u16)nSize;.}.s
cb40: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
cb50: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d  zePtrNoPayload(M
cb60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
cb70: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
cb80: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
cb90: 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69   4; /* For loopi
cba0: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
cbb0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
cbc0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
cbd0: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
cbe0: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a  or a varint */..
cbf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
cc00: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
cc10: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
cc20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
cc30: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
cc40: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
cc50: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
cc60: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
cc70: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
cc80: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
cc90: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
cca0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
ccb0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
ccc0: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
ccd0: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
cce0: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
ccf0: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
cd00: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
cd10: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
cd20: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
cd30: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
cd40: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
cd50: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  buginfo);.#else.
cd60: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
cd70: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
cd80: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
cd90: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
cda0: 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20  ==4 );.  pEnd = 
cdb0: 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69  pIter + 9;.  whi
cdc0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
cdd0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
cde0: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  d );.  assert( d
cdf0: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ebuginfo.nSize==
ce00: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
ce10: 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
ce20: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
ce30: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
ce40: 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ll);.}...#ifdef 
ce50: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
ce60: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
ce70: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
ce80: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
ce90: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
cea0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
ceb0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
cec0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
ced0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
cee0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
cef0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
cf00: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
cf10: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
cf20: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
cf30: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
cf40: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  CUUM./*.** The c
cf50: 65 6c 6c 20 70 43 65 6c 6c 20 69 73 20 63 75 72  ell pCell is cur
cf60: 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70  rently part of p
cf70: 61 67 65 20 70 53 72 63 20 62 75 74 20 77 69 6c  age pSrc but wil
cf80: 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 20  l ultimately be 
cf90: 70 61 72 74 0a 2a 2a 20 6f 66 20 70 50 61 67 65  part.** of pPage
cfa0: 2e 20 20 28 70 53 72 63 20 61 6e 64 20 70 50 61  .  (pSrc and pPa
cfb0: 67 65 72 20 61 72 65 20 6f 66 74 65 6e 20 74 68  ger are often th
cfc0: 65 20 73 61 6d 65 2e 29 20 20 49 66 20 70 43 65  e same.)  If pCe
cfd0: 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  ll contains a.**
cfe0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
cff0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
d000: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
d010: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
d020: 61 70 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6f 76  ap for.** the ov
d030: 65 72 66 6c 6f 77 20 70 61 67 65 20 74 68 61 74  erflow page that
d040: 20 77 69 6c 6c 20 62 65 20 76 61 6c 69 64 20 61   will be valid a
d050: 66 74 65 72 20 70 43 65 6c 6c 20 68 61 73 20 62  fter pCell has b
d060: 65 65 6e 20 6d 6f 76 65 64 20 74 6f 20 70 50 61  een moved to pPa
d070: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
d080: 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  id ptrmapPutOvfl
d090: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
d0a0: 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 53 72  ge, MemPage *pSr
d0b0: 63 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 69 6e 74  c, u8 *pCell,int
d0c0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
d0d0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
d0e0: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
d0f0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
d100: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
d110: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
d120: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
d130: 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
d140: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
d150: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a  .    Pgno ovfl;.
d160: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57      if( SQLITE_W
d170: 49 54 48 49 4e 28 70 53 72 63 2d 3e 61 44 61 74  ITHIN(pSrc->aDat
d180: 61 45 6e 64 2c 20 70 43 65 6c 6c 2c 20 70 43 65  aEnd, pCell, pCe
d190: 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20  ll+info.nLocal) 
d1a0: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
d1b0: 65 28 20 70 53 72 63 21 3d 70 50 61 67 65 20 29  e( pSrc!=pPage )
d1c0: 3b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 53  ;.      *pRC = S
d1d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d1e0: 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
d1f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 76 66 6c  ;.    }.    ovfl
d200: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
d210: 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d  ll[info.nSize-4]
d220: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
d230: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
d240: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
d250: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
d260: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
d270: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
d280: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
d290: 20 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75   given. This rou
d2a0: 74 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73  tine reorganizes
d2b0: 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   cells within th
d2c0: 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61  e.** page so tha
d2d0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
d2e0: 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68  ree-blocks on th
d2f0: 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73  e free-block lis
d300: 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  t..**.** Paramet
d310: 65 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74  er nMaxFrag is t
d320: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
d330: 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20  t of fragmented 
d340: 73 70 61 63 65 20 74 68 61 74 20 6d 61 79 20 62  space that may b
d350: 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  e.** present in 
d360: 74 68 65 20 70 61 67 65 20 61 66 74 65 72 20 74  the page after t
d370: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
d380: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rns..**.** EVIDE
d390: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
d3a0: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
d3b0: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
d3c0: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
d3d0: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
d3e0: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
d3f0: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
d400: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
d410: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
d420: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
d430: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
d440: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
d450: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
d460: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
d470: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
d480: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
d490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
d4a0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
d4b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
d4c0: 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69  t nMaxFrag){.  i
d4d0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
d4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d4f0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
d500: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
d510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d520: 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68  ress of the i-th
d530: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68   cell */.  int h
d540: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
d550: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
d560: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
d570: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
d580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d590: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
d5a0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
d5b0: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
d5c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d5d0: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
d5e0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
d5f0: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
d600: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
d610: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
d620: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
d630: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d650: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
d660: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
d670: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
d6a0: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
d6b0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d6c0: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
d6d0: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
d6e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
d6f0: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
d700: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
d710: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
d720: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d730: 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a   *src;        /*
d740: 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65   Source of conte
d750: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
d760: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
d770: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
d780: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
d790: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
d7a0: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
d7b0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
d7c0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
d7d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d7e0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
d7f0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
d800: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
d810: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
d820: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d830: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d840: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
d850: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
d860: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
d870: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
d880: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d890: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d8a0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d8b0: 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73  .  temp = 0;.  s
d8c0: 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67  rc = data = pPag
d8d0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
d8e0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
d8f0: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
d900: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
d910: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
d920: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
d930: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
d940: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
d950: 72 2b 33 5d 29 20 7c 7c 20 43 4f 52 52 55 50 54  r+3]) || CORRUPT
d960: 5f 44 42 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69  _DB );.  iCellFi
d970: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
d980: 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73   + 2*nCell;.  us
d990: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
d9a0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d9b0: 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  e;..  /* This bl
d9c0: 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61 67 65  ock handles page
d9d0: 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20 66 65  s with two or fe
d9e0: 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  wer free blocks 
d9f0: 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a  and nMaxFrag.  *
da00: 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61 67 6d  * or fewer fragm
da10: 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49 6e 20  ented bytes. In 
da20: 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
da30: 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65 20 74  faster to move t
da40: 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20  he.  ** two (or 
da50: 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63  one) blocks of c
da60: 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f  ells using memmo
da70: 76 65 28 29 20 61 6e 64 20 61 64 64 20 74 68 65  ve() and add the
da80: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f   required.  ** o
da90: 66 66 73 65 74 73 20 74 6f 20 65 61 63 68 20 70  ffsets to each p
daa0: 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 65  ointer in the ce
dab0: 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
dac0: 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20 0a   than it is to .
dad0: 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63 74    ** reconstruct
dae0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
daf0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74  .  */.  if( (int
db00: 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d  )data[hdr+7]<=nM
db10: 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20 69 6e  axFrag ){.    in
db20: 74 20 69 46 72 65 65 20 3d 20 67 65 74 32 62 79  t iFree = get2by
db30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
db40: 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 3e  ;.    if( iFree>
db50: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 72  usableSize-4 ) r
db60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
db70: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
db80: 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 20  ;.    if( iFree 
db90: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 72  ){.      int iFr
dba0: 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  ee2 = get2byte(&
dbb0: 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 20 20  data[iFree]);.  
dbc0: 20 20 20 20 69 66 28 20 69 46 72 65 65 32 3e 75      if( iFree2>u
dbd0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 72 65  sableSize-4 ) re
dbe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dbf0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
dc00: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46  .      if( 0==iF
dc10: 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46  ree2 || (data[iF
dc20: 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61  ree2]==0 && data
dc30: 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29  [iFree2+1]==0) )
dc40: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 45  {.        u8 *pE
dc50: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
dc60: 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
dc70: 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 41  ;.        u8 *pA
dc80: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ddr;.        int
dc90: 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   sz2 = 0;.      
dca0: 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62    int sz = get2b
dcb0: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
dcc0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  2]);.        int
dcd0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
dce0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
dcf0: 20 20 20 20 20 20 20 69 66 28 20 74 6f 70 3e 3d         if( top>=
dd00: 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  iFree ){.       
dd10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dd20: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
dd30: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
dd40: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
dd50: 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e2 ){.          
dd60: 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46 72  if( iFree+sz>iFr
dd70: 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ee2 ) return SQL
dd80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
dd90: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
dda0: 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79 74     sz2 = get2byt
ddb0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32  e(&data[iFree2+2
ddc0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
ddd0: 28 20 69 46 72 65 65 32 2b 73 7a 32 20 3e 20 75  ( iFree2+sz2 > u
dde0: 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75  sableSize ) retu
ddf0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
de00: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
de10: 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
de20: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b  (&data[iFree+sz+
de30: 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65  sz2], &data[iFre
de40: 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69  e+sz], iFree2-(i
de50: 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20  Free+sz));.     
de60: 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a       sz += sz2;.
de70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
de80: 28 20 69 46 72 65 65 2b 73 7a 3e 75 73 61 62 6c  ( iFree+sz>usabl
de90: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
dea0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
deb0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
dec0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
ded0: 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d 20  .        cbrk = 
dee0: 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20  top+sz;.        
def0: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69 46  assert( cbrk+(iF
df00: 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62  ree-top) <= usab
df10: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
df20: 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b    memmove(&data[
df30: 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70  cbrk], &data[top
df40: 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20  ], iFree-top);. 
df50: 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64 72         for(pAddr
df60: 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  =&data[cellOffse
df70: 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b 20  t]; pAddr<pEnd; 
df80: 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20  pAddr+=2){.     
df90: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
dfa0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 20  te(pAddr);.     
dfb0: 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72 65       if( pc<iFre
dfc0: 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41  e ){ put2byte(pA
dfd0: 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20  ddr, pc+sz); }. 
dfe0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
dff0: 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20 70  ( pc<iFree2 ){ p
e000: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
e010: 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20  c+sz2); }.      
e020: 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
e030: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b   defragment_out;
e040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e050: 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73 61   }..  cbrk = usa
e060: 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c  bleSize;.  iCell
e070: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
e080: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
e090: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
e0a0: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
e0b0: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
e0c0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
e0d0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
e0e0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
e0f0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
e100: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
e110: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
e120: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
e130: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
e140: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
e150: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
e160: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
e170: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
e180: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
e190: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52  e().    ** if PR
e1a0: 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63  AGMA cell_size_c
e1b0: 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a  heck=ON..    */.
e1c0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
e1d0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
e1e0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
e1f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e200: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
e210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
e220: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
e230: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
e240: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
e250: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
e260: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
e270: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
e280: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
e290: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
e2a0: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
e2b0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
e2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e2d0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
e2e0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
e2f0: 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73  t( cbrk+size<=us
e300: 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b  ableSize && cbrk
e310: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
e320: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62      testcase( cb
e330: 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  rk+size==usableS
e340: 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ize );.    testc
e350: 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73  ase( pc+size==us
e360: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
e370: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
e380: 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74  cbrk);.    if( t
e390: 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
e3a0: 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28  int x;.      if(
e3b0: 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74   cbrk==pc ) cont
e3c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70  inue;.      temp
e3d0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
e3e0: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
e3f0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
e400: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
e410: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
e420: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65        memcpy(&te
e430: 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c  mp[x], &data[x],
e440: 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78   (cbrk+size) - x
e450: 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74  );.      src = t
e460: 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  emp;.    }.    m
e470: 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b  emcpy(&data[cbrk
e480: 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a  ], &src[pc], siz
e490: 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  e);.  }.  data[h
e4a0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66  dr+7] = 0;.. def
e4b0: 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 61  ragment_out:.  a
e4c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
e4d0: 72 65 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ree>=0 );.  if( 
e4e0: 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b  data[hdr+7]+cbrk
e4f0: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
e500: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
e510: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e520: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
e530: 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
e540: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
e550: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
e560: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
e570: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
e580: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
e590: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65  hdr+2] = 0;.  me
e5a0: 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c  mset(&data[iCell
e5b0: 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d  First], 0, cbrk-
e5c0: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61  iCellFirst);.  a
e5d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e5e0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
e5f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e600: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e610: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
e620: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c  earch the free-l
e630: 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ist on page pPg 
e640: 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f  for space to sto
e650: 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20  re a cell nByte 
e660: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65  bytes in.** size
e670: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
e680: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
e690: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
e6a0: 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20  pace and remove 
e6b0: 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  it.** from the f
e6c0: 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
e6d0: 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73  If no suitable s
e6e0: 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  pace can be foun
e6f0: 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  d on the free-li
e700: 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  st, return NULL.
e710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
e720: 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20  tion may detect 
e730: 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69  corruption withi
e740: 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75  n pPg.  If corru
e750: 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65  ption is.** dete
e760: 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69  cted then *pRc i
e770: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
e780: 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c  CORRUPT and NULL
e790: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
e7a0: 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65  .** Slots on the
e7b0: 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20   free list that 
e7c0: 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e  are between 1 an
e7d0: 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72  d 3 bytes larger
e7e0: 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77   than nByte.** w
e7f0: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69  ill be ignored i
e800: 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74  f adding the ext
e810: 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20  ra space to the 
e820: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  fragmentation co
e830: 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68  unt.** causes th
e840: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
e850: 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20  count to exceed 
e860: 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  60..*/.static u8
e870: 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d   *pageFindSlot(M
e880: 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  emPage *pPg, int
e890: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63   nByte, int *pRc
e8a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
e8b0: 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
e8c0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
e8d0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
e8e0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
e8f0: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
e900: 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20   pPg->aData;    
e910: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
e920: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69   data */.  int i
e930: 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 20  Addr = hdr + 1; 
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e960: 20 6f 66 20 70 74 72 20 74 6f 20 70 63 20 2a 2f   of ptr to pc */
e970: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
e980: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
e990: 72 5d 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  r]);          /*
e9a0: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
e9b0: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74  ee slot */.  int
e9c0: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63 65 73          /* Exces
e9f0: 73 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 6c  s size of the sl
ea00: 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 50  ot */.  int maxP
ea10: 43 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  C = pPg->pBt->us
ea20: 61 62 6c 65 53 69 7a 65 20 2d 20 6e 42 79 74 65  ableSize - nByte
ea30: 3b 20 20 2f 2a 20 4d 61 78 20 61 64 64 72 65 73  ;  /* Max addres
ea40: 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20 73  s for a usable s
ea50: 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  lot */.  int siz
ea60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
ea90: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
eaa0: 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20  .  assert( pc>0 
eab0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3c 3d  );.  while( pc<=
eac0: 6d 61 78 50 43 20 29 7b 0a 20 20 20 20 2f 2a 20  maxPC ){.    /* 
ead0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
eae0: 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74  2710-53328 The t
eaf0: 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20  hird and fourth 
eb00: 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20  bytes of each.  
eb10: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66    ** freeblock f
eb20: 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e  orm a big-endian
eb30: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
eb40: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
eb50: 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20  e freeblock.    
eb60: 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63  ** in bytes, inc
eb70: 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74  luding the 4-byt
eb80: 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
eb90: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
eba0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  (&aData[pc+2]);.
ebb0: 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a      if( (x = siz
ebc0: 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b  e - nByte)>=0 ){
ebd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ebe0: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74   x==4 );.      t
ebf0: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
ec00: 0a 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29  .      if( x<4 )
ec10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
ec20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39  DENCE-OF: R-1149
ec30: 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c  8-58022 In a wel
ec40: 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
ec50: 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a  page, the total.
ec60: 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
ec70: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72  r of bytes in fr
ec80: 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20  agments may not 
ec90: 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20  exceed 60. */.  
eca0: 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b        if( aData[
ecb0: 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75  hdr+7]>57 ) retu
ecc0: 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f  rn 0;..        /
ecd0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
ece0: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
ecf0: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
ed00: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
ed10: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
ed20: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
ed30: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
ed40: 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
ed50: 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b  [iAddr], &aData[
ed60: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
ed70: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d   aData[hdr+7] +=
ed80: 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65   (u8)x;.      }e
ed90: 6c 73 65 20 69 66 28 20 78 2b 70 63 20 3e 20 6d  lse if( x+pc > m
eda0: 61 78 50 43 20 29 7b 0a 20 20 20 20 20 20 20 20  axPC ){.        
edb0: 2f 2a 20 54 68 69 73 20 73 6c 6f 74 20 65 78 74  /* This slot ext
edc0: 65 6e 64 73 20 6f 66 66 20 74 68 65 20 65 6e 64  ends off the end
edd0: 20 6f 66 20 74 68 65 20 75 73 61 62 6c 65 20 70   of the usable p
ede0: 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  art of the page 
edf0: 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  */.        *pRc 
ee00: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
ee10: 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20 20  _PAGE(pPg);.    
ee20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ee30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee40: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
ee50: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
ee60: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
ee70: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
ee80: 75 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  unt.        ** f
ee90: 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75  or the portion u
eea0: 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61  sed by the new a
eeb0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  llocation. */.  
eec0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
eed0: 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  aData[pc+2], x);
eee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
eef0: 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20  eturn &aData[pc 
ef00: 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  + x];.    }.    
ef10: 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20  iAddr = pc;.    
ef20: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  pc = get2byte(&a
ef30: 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69  Data[pc]);.    i
ef40: 66 28 20 70 63 3c 3d 69 41 64 64 72 2b 73 69 7a  f( pc<=iAddr+siz
ef50: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
ef60: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  c ){.        /* 
ef70: 54 68 65 20 6e 65 78 74 20 73 6c 6f 74 20 69 6e  The next slot in
ef80: 20 74 68 65 20 63 68 61 69 6e 20 69 73 20 6e 6f   the chain is no
ef90: 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
efa0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 6c  f the current sl
efb0: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70  ot */.        *p
efc0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
efd0: 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20  UPT_PAGE(pPg);. 
efe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
eff0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
f000: 0a 20 20 69 66 28 20 70 63 3e 6d 61 78 50 43 2b  .  if( pc>maxPC+
f010: 6e 42 79 74 65 2d 34 20 29 7b 0a 20 20 20 20 2f  nByte-4 ){.    /
f020: 2a 20 54 68 65 20 66 72 65 65 20 73 6c 6f 74 20  * The free slot 
f030: 63 68 61 69 6e 20 65 78 74 65 6e 64 73 20 6f 66  chain extends of
f040: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
f050: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 2a 70 52   page */.    *pR
f060: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
f070: 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20  PT_PAGE(pPg);.  
f080: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f090: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
f0a0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
f0b0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
f0c0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
f0d0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
f0e0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
f0f0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
f100: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
f110: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
f120: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
f130: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
f140: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
f150: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
f160: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
f170: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
f180: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
f190: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
f1a0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
f1b0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
f1c0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
f1d0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
f1e0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
f1f0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
f200: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
f210: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
f220: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
f230: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
f240: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
f250: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
f260: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
f270: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
f280: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
f290: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
f2a0: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
f2b0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
f2c0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
f2d0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
f2e0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
f2f0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
f300: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
f310: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
f320: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
f330: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
f340: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
f350: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
f360: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
f370: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f380: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
f390: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
f3a0: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
f3b0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
f3c0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
f3d0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
f3e0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
f3f0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
f420: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
f430: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
f440: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f450: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
f460: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
f470: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
f480: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
f490: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
f4a0: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
f4b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
f4c0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
f4d0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
f4e0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
f4f0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
f500: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
f510: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
f520: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
f530: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f540: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f550: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
f560: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
f570: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
f580: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
f590: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
f5a0: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
f5b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
f5c0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
f5d0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
f5e0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
f5f0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
f600: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
f610: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
f620: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
f630: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
f640: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
f650: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
f660: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
f670: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
f680: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
f690: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
f6a0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
f6b0: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
f6c0: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
f6d0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
f6e0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
f6f0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
f700: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
f710: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
f720: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
f730: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
f740: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
f750: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
f760: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
f770: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
f780: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
f790: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
f7a0: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
f7b0: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
f7c0: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
f7d0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
f7e0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
f7f0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
f800: 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74  ssert( top<=(int
f810: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
f820: 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 62 79  bleSize ); /* by
f830: 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72 65   btreeComputeFre
f840: 65 53 70 61 63 65 28 29 20 2a 2f 0a 20 20 69 66  eSpace() */.  if
f850: 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20  ( gap>top ){.   
f860: 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70   if( top==0 && p
f870: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
f880: 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a  eSize==65536 ){.
f890: 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33        top = 6553
f8a0: 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
f8b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f8c0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
f8d0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
f8e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
f8f0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
f900: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
f910: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
f920: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2c 0a 20   cell pointer,. 
f930: 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 66   ** and if the f
f940: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
f950: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
f960: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
f970: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
f980: 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  a slot big enoug
f990: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
f9a0: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
f9b0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
f9c0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
f9d0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
f9e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
f9f0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
fa00: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
fa10: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
fa20: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
fa30: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
fa40: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
fa50: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
fa60: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
fa70: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
fa80: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
fa90: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
faa0: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
fab0: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
fac0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
fad0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fae0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
faf0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
fb00: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
fb10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
fb20: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
fb30: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
fb40: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
fb50: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
fb60: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
fb70: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
fb80: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
fb90: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
fba0: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
fbb0: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
fbc0: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
fbd0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
fbe0: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
fbf0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
fc00: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 30 20 29  Page->nFree>=0 )
fc10: 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  ;.    rc = defra
fc20: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c  gmentPage(pPage,
fc30: 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e   MIN(4, pPage->n
fc40: 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29  Free - (2+nByte)
fc50: 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
fc60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fc70: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
fc80: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
fc90: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
fca0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f   gap+2+nByte<=to
fcb0: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
fcc0: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
fcd0: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
fce0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
fcf0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
fd00: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
fd10: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
fd20: 54 68 65 20 62 74 72 65 65 43 6f 6d 70 75 74 65  The btreeCompute
fd30: 46 72 65 65 53 70 61 63 65 28 29 20 63 61 6c 6c  FreeSpace() call
fd40: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a   has already.  *
fd50: 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  * validated the 
fd60: 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e  freelist.  Given
fd70: 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69   that the freeli
fd80: 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65  st is valid, the
fd90: 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61  re.  ** is no wa
fda0: 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  y that the alloc
fdb0: 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64  ation can extend
fdc0: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
fdd0: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54  the page..  ** T
fde0: 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
fdf0: 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70  w verifies the p
fe00: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
fe10: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20  ..  */.  top -= 
fe20: 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74  nByte;.  put2byt
fe30: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
fe40: 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  top);.  assert( 
fe50: 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e  top+nByte <= (in
fe60: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
fe70: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70  ableSize );.  *p
fe80: 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74  Idx = top;.  ret
fe90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fea0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
feb0: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
fec0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
fed0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
fee0: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
fef0: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
ff00: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
ff10: 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a  aData[iStart].**
ff20: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
ff30: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53   the block is iS
ff40: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
ff50: 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c   Adjacent freebl
ff60: 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63  ocks are coalesc
ff70: 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 6e 20 74  ed..**.** Even t
ff80: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
ff90: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
ffa0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 43 6f 6d  cked by btreeCom
ffb0: 70 75 74 65 46 72 65 65 53 70 61 63 65 28 29 2c  puteFreeSpace(),
ffc0: 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65  .** that routine
ffd0: 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74   will not detect
ffe0: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e   overlap between
fff0: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
10000 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f  ocks.  Nor.** do
10010 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65 6c  es it detect cel
10020 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
10030 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69   that encrouch i
10040 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65 64  nto the reserved
10050 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65   bytes.** at the
10060 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
10070 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f  .  So do additio
10080 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63  nal corruption c
10090 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69  hecks inside thi
100a0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64  s.** routine and
100b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
100c0 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70 72  ORRUPT if any pr
100d0 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64  oblems are found
100e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
100f0 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
10100 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53  e *pPage, u16 iS
10110 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29  tart, u16 iSize)
10120 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20 20  {.  u16 iPtr;   
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10150 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e  ress of ptr to n
10160 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
10170 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b  .  u16 iFreeBlk;
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
101a0 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
101b0 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
101c0 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61       /* Page hea
101f0 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20  der size.  0 or 
10200 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61  100 */.  u8 nFra
10210 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10230 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66  * Reduction in f
10240 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  ragmentation */.
10250 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20    u16 iOrigSize 
10260 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  = iSize;        
10270 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
10280 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69  nal value of iSi
10290 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20  ze */.  u16 x;  
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
102c0 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
102d0 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
102e0 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
102f0 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
10300 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
10310 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
10320 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
10330 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
10340 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
10350 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
10360 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
10370 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
10380 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
10390 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
103a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
103b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
103c0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
103d0 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67   || iStart>=pPag
103e0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
103f0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
10400 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
10410 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45  CORRUPT_DB || iE
10420 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  nd <= pPage->pBt
10430 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
10440 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10450 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
10460 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
10470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69  );.  assert( iSi
10480 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=4 );   /* Mi
10490 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
104a0 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
104b0 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67 65 2d  ( iStart<=pPage-
104c0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
104d0 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  -4 );..  /* The 
104e0 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
104f0 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
10500 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
10510 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73  Find the .  ** s
10520 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  pot on the list 
10530 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f  where iStart sho
10540 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e  uld be inserted.
10550 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
10560 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
10570 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31    iPtr = hdr + 1
10580 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74  ;.  if( data[iPt
10590 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b  r+1]==0 && data[
105a0 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iPtr]==0 ){.    
105b0 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f  iFreeBlk = 0;  /
105c0 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74  * Shortcut for t
105d0 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
105e0 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
105f0 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ty */.  }else{. 
10600 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65     while( (iFree
10610 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
10620 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74  data[iPtr]))<iSt
10630 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
10640 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
10650 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10660 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72  iFreeBlk==0 ) br
10670 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  eak;.        ret
10680 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10690 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
106a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50        }.      iP
106b0 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
106c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
106d0 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74  eeBlk>pPage->pBt
106e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
106f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10700 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10710 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
10720 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
10730 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
10740 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
10750 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
10760 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
10770 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
10780 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
10790 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
107a0 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
107b0 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
107c0 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
107d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65   pointer to iFre
107e0 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eBlk.    **.    
107f0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
10800 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75  if iFreeBlk shou
10810 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20  ld be coalesced 
10820 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
10830 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20  iStart..    */. 
10840 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20     if( iFreeBlk 
10850 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65  && iEnd+3>=iFree
10860 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72  Blk ){.      nFr
10870 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20  ag = iFreeBlk - 
10880 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iEnd;.      if( 
10890 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20  iEnd>iFreeBlk ) 
108a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
108b0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
108c0 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20  );.      iEnd = 
108d0 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62  iFreeBlk + get2b
108e0 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42  yte(&data[iFreeB
108f0 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  lk+2]);.      if
10900 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e  ( iEnd > pPage->
10910 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10920 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
10930 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10940 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
10950 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 69 7a      }.      iSiz
10960 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
10970 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
10980 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
10990 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
109a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
109b0 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
109c0 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
109d0 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
109e0 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
109f0 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
10a00 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
10a10 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
10a20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
10a30 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
10a40 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
10a50 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
10a60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10a70 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
10a80 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
10a90 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
10aa0 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
10ab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
10ac0 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
10ad0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
10ae0 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
10af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10b00 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10b10 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
10b20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
10b30 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
10b40 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
10b50 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
10b60 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
10b70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
10b80 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
10b90 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10ba0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
10bb0 61 67 65 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  age);.    data[h
10bc0 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
10bd0 20 20 7d 0a 20 20 78 20 3d 20 67 65 74 32 62 79    }.  x = get2by
10be0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
10bf0 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 3c 3d  ;.  if( iStart<=
10c00 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  x ){.    /* The 
10c10 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73  new freeblock is
10c20 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
10c30 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  g of the cell co
10c40 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20  ntent area,.    
10c50 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e  ** so just exten
10c60 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
10c70 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74  nt area rather t
10c80 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68  han create anoth
10c90 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69  er.    ** freeli
10ca0 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  st entry */.    
10cb0 69 66 28 20 69 53 74 61 72 74 3c 78 20 7c 7c 20  if( iStart<x || 
10cc0 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65  iPtr!=hdr+1 ) re
10cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10ce0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10cf0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
10d00 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65  ata[hdr+1], iFre
10d10 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
10d20 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
10d30 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  , iEnd);.  }else
10d40 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  {.    /* Insert 
10d50 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  the new freebloc
10d60 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c  k into the freel
10d70 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62  ist */.    put2b
10d80 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c  yte(&data[iPtr],
10d90 20 69 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20   iStart);.  }.  
10da0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
10db0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
10dc0 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
10dd0 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
10de0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
10df0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
10e00 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
10e10 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
10e20 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
10e30 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
10e40 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53  a[iStart], 0, iS
10e50 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32  ize);.  }.  put2
10e60 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
10e70 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
10e80 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
10e90 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65  iStart+2], iSize
10ea0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
10eb0 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
10ec0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ed0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
10ee0 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
10ef0 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
10f00 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
10f10 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
10f20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
10f30 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
10f40 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
10f50 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
10f60 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
10f70 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
10f80 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
10f90 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
10fa0 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
10fb0 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
10fc0 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
10fd0 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
10fe0 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
10ff0 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
11000 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
11010 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
11020 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
11030 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
11040 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
11050 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
11060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
11070 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
11080 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
11090 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
110a0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
110b0 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
110c0 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
110d0 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
110e0 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
110f0 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
11100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11110 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11120 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
11130 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
11140 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
11150 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
11160 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
11170 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
11180 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
11190 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
111a0 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
111b0 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
111c0 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
111d0 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
111e0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
111f0 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
11200 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
11210 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
11220 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
11230 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
11240 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
11250 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
11260 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
11270 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
11280 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
11290 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
112a0 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
112b0 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
112c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
112d0 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
112e0 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
112f0 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
11300 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
11310 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
11320 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
11330 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
11340 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
11350 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
11360 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
11370 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
11380 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
11390 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
113a0 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
113b0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
113c0 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
113d0 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
113e0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
113f0 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
11400 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
11410 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
11420 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
11430 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
11440 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
11450 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
11460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
11470 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
11480 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
11490 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
114a0 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
114b0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
114c0 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
114d0 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
114e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
114f0 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
11500 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
11510 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
11520 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
11530 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
11540 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
11550 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
11560 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
11570 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
11580 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
11590 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
115a0 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
115b0 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
115c0 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
115d0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
115e0 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
115f0 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
11600 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
11610 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
11620 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
11630 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
11640 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
11650 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
11660 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
11670 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
11680 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
11690 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
116a0 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
116b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
116c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
116d0 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
116e0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
116f0 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
11700 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
11710 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
11720 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11730 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
11740 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
11750 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
11760 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
11770 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
11780 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11790 43 6f 6d 70 75 74 65 20 74 68 65 20 61 6d 6f 75  Compute the amou
117a0 6e 74 20 6f 66 20 66 72 65 65 73 70 61 63 65 20  nt of freespace 
117b0 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 49 6e  on the page.  In
117c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 69   other words, fi
117d0 6c 6c 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ll.** in the pPa
117e0 67 65 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 2e  ge->nFree field.
117f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
11800 74 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53  treeComputeFreeS
11810 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
11820 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  age){.  int pc; 
11830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
11840 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
11850 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
11860 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
11870 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
11880 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
11890 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
118a0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
118b0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
118c0 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
118d0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
118e0 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
118f0 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
11900 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
11910 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ach page */.  in
11920 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
11930 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
11940 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
11950 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
11960 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
11970 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
11980 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
11990 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69   area */.  int i
119a0 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
119b0 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
119c0 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
119d0 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ck offset */.  i
119e0 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
119f0 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
11a00 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
11a10 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
11a20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
11a30 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
11a40 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
11a50 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  >db!=0 );.  asse
11a60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11a70 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11a80 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11a90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
11aa0 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
11ab0 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
11ac0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
11ad0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
11ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11af0 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
11b00 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
11b10 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
11b20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
11b30 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
11b40 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
11b50 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
11b60 74 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  t==1 );.  assert
11b70 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 30  ( pPage->nFree<0
11b80 20 29 3b 0a 0a 20 20 75 73 61 62 6c 65 53 69 7a   );..  usableSiz
11b90 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
11ba0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 68 64  usableSize;.  hd
11bb0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
11bc0 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
11bd0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f  Page->aData;.  /
11be0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11bf0 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65  -58015-48175 The
11c00 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
11c10 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65  r at offset 5 de
11c20 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68  signates.  ** th
11c30 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
11c40 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
11c50 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66  . A zero value f
11c60 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20  or this integer 
11c70 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65  is.  ** interpre
11c80 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f  ted as 65536. */
11c90 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
11ca0 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
11cb0 64 72 2b 35 5d 29 3b 0a 20 20 69 43 65 6c 6c 46  dr+5]);.  iCellF
11cc0 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
11cd0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
11ce0 53 69 7a 65 20 2b 20 32 2a 70 50 61 67 65 2d 3e  Size + 2*pPage->
11cf0 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61  nCell;.  iCellLa
11d00 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
11d10 2d 20 34 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  - 4;..  /* Compu
11d20 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
11d30 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
11d40 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43  age.  ** EVIDENC
11d50 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
11d60 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
11d70 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
11d80 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
11d90 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65   ** start of the
11da0 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
11db0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72   on the page, or
11dc0 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72   is zero if ther
11dd0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72  e are no.  ** fr
11de0 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70  eeblocks. */.  p
11df0 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
11e00 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46  ta[hdr+1]);.  nF
11e10 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
11e20 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
11e30 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
11e40 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
11e50 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e  ace */.  if( pc>
11e60 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78  0 ){.    u32 nex
11e70 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28  t, size;.    if(
11e80 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29   pc<iCellFirst )
11e90 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
11ea0 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
11eb0 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
11ec0 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
11ed0 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
11ee0 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62       ** always b
11ef0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63  e at least one c
11f00 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66  ell before the f
11f10 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a  irst freeblock..
11f20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
11f30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11f40 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
11f50 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  ; .    }.    whi
11f60 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
11f70 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  f( pc>iCellLast 
11f80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
11f90 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20  eeblock off the 
11fa0 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
11fb0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
11fc0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11fd0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
11fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
11ff0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
12000 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
12010 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
12020 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
12030 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
12040 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  + size;.      if
12050 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  ( next<=pc+size+
12060 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
12070 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
12080 7d 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30  }.    if( next>0
12090 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   ){.      /* Fre
120a0 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73  eblock not in as
120b0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
120c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
120d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
120e0 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
120f0 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e      if( pc+size>
12100 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73  (unsigned int)us
12110 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
12120 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c    /* Last freebl
12130 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74  ock extends past
12140 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20   page end */.   
12150 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12160 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
12170 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
12180 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
12190 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
121a0 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
121b0 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
121c0 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
121d0 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
121e0 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
121f0 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
12200 65 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74  es within.  ** t
12210 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
12220 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
12230 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
12240 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
12250 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
12260 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75  then the page mu
12270 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  st be corrupted.
12280 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f   This check also
12290 0a 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20  .  ** serves to 
122a0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
122b0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
122c0 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
122d0 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65  content.  ** are
122e0 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  a, according to 
122f0 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c  the page header,
12300 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65   lies within the
12310 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
12320 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69  ( nFree>usableSi
12330 7a 65 20 7c 7c 20 6e 46 72 65 65 3c 69 43 65 6c  ze || nFree<iCel
12340 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 72 65  lFirst ){.    re
12350 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12360 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
12370 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
12380 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65  ree = (u16)(nFre
12390 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b  e - iCellFirst);
123a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
123b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
123c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
123d0 74 79 20 63 68 65 63 6b 20 61 66 74 65 72 20 62  ty check after b
123e0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 69  treeInitPage() i
123f0 66 0a 2a 2a 20 50 52 41 47 4d 41 20 63 65 6c 6c  f.** PRAGMA cell
12400 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 20 0a  _size_check=ON .
12410 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
12420 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
12430 72 65 65 43 65 6c 6c 53 69 7a 65 43 68 65 63 6b  reeCellSizeCheck
12440 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
12450 7b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  {.  int iCellFir
12460 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
12470 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
12480 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
12490 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  et */.  int iCel
124a0 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
124b0 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
124c0 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
124d0 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  fset */.  int i;
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
124f0 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
12500 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
12510 79 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b 20 20  y */.  int sz;  
12520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
12530 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
12540 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
12550 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
12560 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
12570 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
12580 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
12590 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
125a0 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
125b0 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 75 73  Data */.  int us
125c0 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
125d0 4d 61 78 69 6d 75 6d 20 75 73 61 62 6c 65 20 73  Maximum usable s
125e0 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
125f0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
12600 66 73 65 74 3b 20 20 20 20 2f 2a 20 53 74 61 72  fset;    /* Star
12610 74 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t of cell conten
12620 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 69 43 65  t area */..  iCe
12630 6c 6c 46 69 72 73 74 20 3d 20 70 50 61 67 65 2d  llFirst = pPage-
12640 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
12650 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
12660 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
12670 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
12680 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ize;.  iCellLast
12690 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
126a0 34 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  4;.  data = pPag
126b0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 63 65 6c 6c  e->aData;.  cell
126c0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
126d0 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66  cellOffset;.  if
126e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
126f0 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
12700 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
12710 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
12720 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
12730 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65  Aligned(&data[ce
12740 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a  llOffset+i*2]);.
12750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
12760 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
12770 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
12780 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
12790 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
127a0 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
127b0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
127c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
127d0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
127e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20  .    }.    sz = 
127f0 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
12800 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
12810 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ]);.    testcase
12820 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53  ( pc+sz==usableS
12830 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ize );.    if( p
12840 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
12850 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12860 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
12870 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
12880 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
12890 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
128a0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
128b0 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
128c0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
128d0 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
128e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
128f0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
12900 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
12910 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
12920 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
12930 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
12940 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
12950 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
12960 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
12970 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
12980 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
12990 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
129a0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
129b0 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
129c0 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
129d0 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
129e0 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
129f0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
12a00 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
12a10 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
12a20 65 29 7b 0a 20 20 75 38 20 2a 64 61 74 61 3b 20  e){.  u8 *data; 
12a30 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
12a40 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
12a50 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
12a60 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
12a70 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
12a80 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20 20 61  tructure */..  a
12a90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
12aa0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
12ab0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62  ( pPage->pBt->db
12ac0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12ad0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12ae0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
12af0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
12b00 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
12b10 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
12b20 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
12b30 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
12b40 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
12b50 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
12b60 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
12b70 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
12b80 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
12b90 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
12ba0 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
12bb0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
12bc0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
12bd0 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50  0 );..  pBt = pP
12be0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 64 61 74 61  age->pBt;.  data
12bf0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   = pPage->aData 
12c00 2b 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  + pPage->hdrOffs
12c10 65 74 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  et;.  /* EVIDENC
12c20 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
12c30 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
12c40 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
12c50 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a  0 indicating.  *
12c60 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  * the b-tree pag
12c70 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28  e type. */.  if(
12c80 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
12c90 67 65 2c 20 64 61 74 61 5b 30 5d 29 20 29 7b 0a  ge, data[0]) ){.
12ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12cb0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
12cc0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Page);.  }.  ass
12cd0 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
12ce0 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
12cf0 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
12d00 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
12d10 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
12d20 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
12d30 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
12d40 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
12d50 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70  ->cellOffset = p
12d60 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
12d70 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
12d80 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 70 50 61  ldPtrSize;.  pPa
12d90 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 64  ge->aCellIdx = d
12da0 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ata + pPage->chi
12db0 6c 64 50 74 72 53 69 7a 65 20 2b 20 38 3b 0a 20  ldPtrSize + 8;. 
12dc0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
12dd0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   = pPage->aData 
12de0 2b 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  + pBt->usableSiz
12df0 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  e;.  pPage->aDat
12e00 61 4f 66 73 74 20 3d 20 70 50 61 67 65 2d 3e 61  aOfst = pPage->a
12e10 44 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 63 68  Data + pPage->ch
12e20 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 2f 2a  ildPtrSize;.  /*
12e30 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
12e40 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20  37002-32774 The 
12e50 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
12e60 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76   at offset 3 giv
12e70 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62  es the.  ** numb
12e80 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
12e90 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50  he page. */.  pP
12ea0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
12eb0 32 62 79 74 65 28 26 64 61 74 61 5b 33 5d 29 3b  2byte(&data[3]);
12ec0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
12ed0 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
12ee0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
12ef0 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
12f00 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
12f10 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
12f20 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
12f30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12f40 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
12f50 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
12f60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58  pPage->nCell==MX
12f70 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20  _CELL(pBt) );.  
12f80 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
12f90 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49 66  R-24089-57979 If
12fa0 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73   a page contains
12fb0 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68   no cells (which
12fc0 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f   is only.  ** po
12fd0 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
12fe0 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
12ff0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
13000 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
13010 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f  e.  ** offset to
13020 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
13030 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61  t area will equa
13040 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  l the page size 
13050 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20 62  minus the.  ** b
13060 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64  ytes of reserved
13070 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73   space. */.  ass
13080 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
13090 6c 3e 30 0a 20 20 20 20 20 20 20 7c 7c 20 67 65  l>0.       || ge
130a0 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
130b0 61 74 61 5b 35 5d 29 3d 3d 28 69 6e 74 29 70 42  ata[5])==(int)pB
130c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 0a 20 20  t->usableSize.  
130d0 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
130e0 44 42 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  DB );.  pPage->n
130f0 46 72 65 65 20 3d 20 2d 31 3b 20 20 2f 2a 20 49  Free = -1;  /* I
13100 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 69  ndicate that thi
13110 73 20 76 61 6c 75 65 20 69 73 20 79 65 74 20 75  s value is yet u
13120 6e 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 20 20 70  ncomputed */.  p
13130 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
13140 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d  ;.  if( pBt->db-
13150 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
13160 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20  CellSizeCk ){.  
13170 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 43 65    return btreeCe
13180 6c 6c 53 69 7a 65 43 68 65 63 6b 28 70 50 61 67  llSizeCheck(pPag
13190 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
131a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
131b0 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61  *.** Set up a ra
131c0 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69  w page so that i
131d0 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64  t looks like a d
131e0 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c  atabase page hol
131f0 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69  ding.** no entri
13200 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
13210 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50  id zeroPage(MemP
13220 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
13230 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e  flags){.  unsign
13240 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
13250 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
13260 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13270 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
13280 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
13290 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66  rOffset;.  u16 f
132a0 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
132b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
132c0 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
132d0 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
132e0 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
132f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
13300 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
13310 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
13320 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
13330 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
13340 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
13350 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20  DbPage) == data 
13360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13370 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
13380 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
13390 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
133a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
133b0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
133c0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62   );.  if( pBt->b
133d0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41  tsFlags & BTS_FA
133e0 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20  ST_SECURE ){.   
133f0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
13400 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
13410 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
13420 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d   }.  data[hdr] =
13430 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
13440 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28  first = hdr + ((
13450 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
13460 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20  =0 ? 12 : 8);.  
13470 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
13480 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
13490 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
134a0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
134b0 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
134c0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
134d0 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
134e0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
134f0 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
13500 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
13510 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
13520 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
13530 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  rst;.  pPage->aD
13540 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70  ataEnd = &data[p
13550 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
13560 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  .  pPage->aCellI
13570 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74  dx = &data[first
13580 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  ];.  pPage->aDat
13590 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
135a0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
135b0 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  e];.  pPage->nOv
135c0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
135d0 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
135e0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
135f0 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
13600 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
13610 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
13620 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
13630 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
13640 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
13650 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
13660 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
13670 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
13680 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
13690 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
136a0 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
136b0 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
136c0 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
136d0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
136e0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
136f0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
13700 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
13710 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
13720 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
13730 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
13740 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67  bPage);.  if( pg
13750 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  no!=pPage->pgno 
13760 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  ){.    pPage->aD
13770 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
13780 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
13790 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  e);.    pPage->p
137a0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
137b0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74  ;.    pPage->pBt
137c0 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67   = pBt;.    pPag
137d0 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
137e0 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66      pPage->hdrOf
137f0 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f  fset = pgno==1 ?
13800 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20   100 : 0;.  }.  
13810 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
13820 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
13830 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
13840 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e) );.  return p
13850 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
13860 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
13870 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
13880 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
13890 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
138a0 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
138b0 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20  ents if needed. 
138c0 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65   See also: btree
138d0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e  GetUnusedPage().
138e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41  .**.** If the PA
138f0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
13900 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  T flag is set, i
13910 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
13920 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61  do not care.** a
13930 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
13940 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
13950 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
13960 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
13970 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
13980 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
13990 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
139a0 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
139b0 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
139c0 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
139d0 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
139e0 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
139f0 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
13a00 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
13a10 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
13a20 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
13a30 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
13a40 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
13a50 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
13a60 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
13a70 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67   int btreeGetPag
13a80 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
13a90 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
13aa0 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
13ab0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
13ac0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
13ad0 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
13ae0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
13af0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
13b00 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
13b10 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
13b20 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
13b30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
13b40 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
13b50 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
13b60 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
13b70 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
13b80 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
13b90 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
13ba0 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
13bb0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c  _NOCONTENT || fl
13bc0 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  ags==PAGER_GET_R
13bd0 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73  EADONLY );.  ass
13be0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13bf0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
13c00 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
13c10 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
13c20 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
13c30 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
13c40 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
13c50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13c60 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
13c70 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
13c80 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
13c90 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
13ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13cb0 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
13cc0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
13cd0 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
13ce0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
13cf0 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
13d00 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
13d10 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
13d20 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
13d30 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
13d40 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
13d50 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
13d60 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
13d70 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
13d80 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
13d90 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
13da0 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
13db0 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
13dc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13dd0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13de0 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
13df0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
13e00 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
13e10 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
13e20 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
13e30 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
13e40 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
13e50 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
13e60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
13e70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13e80 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
13e90 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
13ea0 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
13eb0 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
13ec0 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
13ed0 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
13ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
13ef0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42  btreePagecount(B
13f00 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
13f10 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61   return pBt->nPa
13f20 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65  ge;.}.u32 sqlite
13f30 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42  3BtreeLastPage(B
13f40 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
13f50 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
13f60 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
13f70 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e  .  assert( ((p->
13f80 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30  pBt->nPage)&0x80
13f90 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
13fa0 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
13fb0 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
13fc0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
13fd0 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
13fe0 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
13ff0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43   it..**.** If pC
14000 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ur!=0 then the p
14010 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74  age is being fet
14020 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ched as part of 
14030 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a  a moveToChild().
14040 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64  ** call.  Do add
14050 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63  itional sanity c
14060 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
14070 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
14080 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20  ..** And if the 
14090 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69  fetch fails, thi
140a0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64  s routine must d
140b0 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69  ecrement pCur->i
140c0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Page..**.** The 
140d0 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20  page is fetched 
140e0 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e  as read-write un
140f0 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74  less pCur is not
14100 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20   NULL and is.** 
14110 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
14120 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  or..**.** If an 
14130 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
14140 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e  en *ppPage is un
14150 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
14160 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
14170 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
14180 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
14190 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
141a0 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
141b0 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
141c0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
141d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
141e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
141f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14220 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
14230 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
14240 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
14250 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
14260 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
14270 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72   here */.  BtCur
14280 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
14290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
142a0 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20  rsor to receive 
142b0 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c  the page, or NUL
142c0 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64  L */.  int bRead
142d0 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20  Only            
142e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
142f0 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70  or a read-only p
14300 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
14310 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
14320 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
14330 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14340 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
14350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
14360 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d  r==0 || ppPage==
14370 26 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a  &pCur->pPage );.
14380 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
14390 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d  0 || bReadOnly==
143a0 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
143b0 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ags );.  assert(
143c0 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72   pCur==0 || pCur
143d0 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20  ->iPage>0 );..  
143e0 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
143f0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
14400 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14410 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14420 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
14430 74 50 61 67 65 5f 65 72 72 6f 72 31 3b 0a 20 20  tPage_error1;.  
14440 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
14450 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
14460 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
14470 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
14480 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66  bReadOnly);.  if
14490 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ( rc ){.    goto
144a0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
144b0 65 72 72 6f 72 31 3b 0a 20 20 7d 0a 20 20 2a 70  error1;.  }.  *p
144c0 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
144d0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
144e0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
144f0 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
14500 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
14510 20 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d     btreePageFrom
14520 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
14530 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20  pgno, pBt);.    
14540 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
14550 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
14560 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
14580 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
14590 65 72 72 6f 72 32 3b 0a 20 20 20 20 7d 0a 20 20  error2;.    }.  
145a0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
145b0 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
145c0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
145d0 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d  *ppPage)->aData=
145e0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
145f0 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
14600 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e  ..  /* If obtain
14610 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67 65  ing a child page
14620 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77   for a cursor, w
14630 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74 68  e must verify th
14640 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  at the page is. 
14650 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   ** compatible w
14660 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ith the root pag
14670 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  e. */.  if( pCur
14680 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e   && ((*ppPage)->
14690 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50  nCell<1 || (*ppP
146a0 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  age)->intKey!=pC
146b0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29  ur->curIntKey) )
146c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
146d0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
146e0 67 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67  gno);.    goto g
146f0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
14700 72 6f 72 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ror2;.  }.  retu
14710 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67  rn SQLITE_OK;..g
14720 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
14730 72 6f 72 32 3a 0a 20 20 72 65 6c 65 61 73 65 50  ror2:.  releaseP
14740 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 67 65  age(*ppPage);.ge
14750 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
14760 6f 72 31 3a 0a 20 20 69 66 28 20 70 43 75 72 20  or1:.  if( pCur 
14770 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61  ){.    pCur->iPa
14780 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ge--;.    pCur->
14790 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
147a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
147b0 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  ];.  }.  testcas
147c0 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20  e( pgno==0 );.  
147d0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
147e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  || rc==SQLITE_CO
147f0 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72  RRUPT );.  retur
14800 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
14810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
14820 43 55 52 52 45 4e 54 0a 2f 2a 20 0a 2a 2a 20 53  CURRENT./* .** S
14830 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
14840 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 67 6e 6f  the MemPage.pgno
14850 52 6f 6f 74 20 76 61 72 69 61 62 6c 65 2c 20 69  Root variable, i
14860 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  f it exists..*/.
14870 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4d  static void setM
14880 65 6d 70 61 67 65 52 6f 6f 74 28 4d 65 6d 50 61  empageRoot(MemPa
14890 67 65 20 2a 70 50 67 2c 20 75 33 32 20 70 67 6e  ge *pPg, u32 pgn
148a0 6f 52 6f 6f 74 29 7b 0a 20 20 70 50 67 2d 3e 70  oRoot){.  pPg->p
148b0 67 6e 6f 52 6f 6f 74 20 3d 20 70 67 6e 6f 52 6f  gnoRoot = pgnoRo
148c0 6f 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  ot;.}.#else.# de
148d0 66 69 6e 65 20 73 65 74 4d 65 6d 70 61 67 65 52  fine setMempageR
148e0 6f 6f 74 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  oot(x,y).#endif.
148f0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
14900 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
14910 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
14920 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
14930 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
14940 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a  btreeGetPage..**
14950 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20 73  .** Page1 is a s
14960 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64 20  pecial case and 
14970 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64  must be released
14980 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50 61   using releasePa
14990 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  geOne()..*/.stat
149a0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
149b0 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61  ageNotNull(MemPa
149c0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
149d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
149e0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
149f0 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
14a00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
14a10 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  DbPage!=0 );.  a
14a20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
14a30 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
14a40 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
14a50 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
14a60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14a70 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
14a80 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
14a90 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
14aa0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14ab0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
14ac0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
14ad0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
14ae0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
14af0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73  e->pDbPage);.}.s
14b00 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
14b10 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
14b20 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
14b30 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
14b40 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b  eNotNull(pPage);
14b50 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
14b60 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65  eleasePageOne(Me
14b70 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
14b80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d   assert( pPage!=
14b90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14ba0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
14bb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
14bc0 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
14bd0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
14be0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14bf0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
14c00 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
14c10 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
14c20 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
14c30 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
14c40 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
14c50 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
14c60 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
14c70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14c80 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
14c90 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
14ca0 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61 67  te3PagerUnrefPag
14cb0 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62 50  eOne(pPage->pDbP
14cc0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age);.}../*.** G
14cd0 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67  et an unused pag
14ce0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  e..**.** This wo
14cf0 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74  rks just like bt
14d00 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74  reeGetPage() wit
14d10 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a  h the addition:.
14d20 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68  **.**   *  If th
14d30 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
14d40 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d  y in use for som
14d50 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c  e other purpose,
14d60 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
14d70 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20       release it 
14d80 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
14d90 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72  LITE_CURRUPT err
14da0 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65  or..**   *  Make
14db0 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74   sure the isInit
14dc0 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a   flag is clear.*
14dd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
14de0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
14df0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14e00 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
14e10 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
14e20 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
14e30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
14e40 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
14e50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
14e60 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
14e70 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
14e80 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
14e90 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
14ea0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
14eb0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
14ec0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
14ed0 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
14ee0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
14ef0 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
14f00 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
14f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14f20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
14f30 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
14f40 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
14f50 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
14f60 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14f70 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
14f80 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
14f90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14fa0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14fb0 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
14fc0 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
14fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
14fe0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
14ff0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
15000 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
15010 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
15020 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
15030 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
15040 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
15050 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
15060 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
15070 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
15080 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
15090 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
150a0 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
150b0 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
150c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
150d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
150e0 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
150f0 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
15100 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
15110 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
15120 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
15130 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
15140 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
15150 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
15160 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
15170 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
15180 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
15190 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
151a0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
151b0 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
151c0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
151d0 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
151e0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
151f0 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
15200 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15210 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
15220 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
15230 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
15240 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
15250 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
15260 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
15270 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
15280 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
15290 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
152a0 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
152b0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
152c0 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
152d0 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
152e0 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
152f0 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
15300 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
15310 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
15320 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
15330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
15340 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
15350 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
15360 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
15370 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
15380 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
15390 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
153a0 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
153b0 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
153c0 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
153d0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
153e0 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
153f0 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
15400 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
15410 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
15420 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
15430 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15440 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
15450 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
15460 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
15470 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
15480 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
15490 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
154a0 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
154b0 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
154c0 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
154d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
154e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
154f0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
15500 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
15510 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
15520 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
15530 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20 20  andler,.        
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15560 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
15570 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  pPager));.}../*.
15580 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
15590 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
155a0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
155b0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
155c0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
155d0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
155e0 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68  L.** then an eph
155f0 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
15600 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
15610 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
15620 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ase might.** be 
15630 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d  exclusively in m
15640 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  emory, or it mig
15650 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61  ht use a disk-ba
15660 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  sed memory cache
15670 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c  ..** Either way,
15680 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   the ephemeral d
15690 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
156a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
156b0 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73  leted .** when s
156c0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
156d0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
156e0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
156f0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
15700 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
15710 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
15720 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
15730 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
15740 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
15750 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
15760 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72   The "flags" par
15770 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
15780 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63  ask that might c
15790 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65  ontain bits like
157a0 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a  .** BTREE_OMIT_J
157b0 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54  OURNAL and/or BT
157c0 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  REE_MEMORY..**.*
157d0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
157e0 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
157f0 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
15800 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
15810 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
15820 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
15830 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
15840 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
15850 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
15860 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
15870 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
15880 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
15890 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
158a0 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
158b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
158c0 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
158d0 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
158e0 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
158f0 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
15900 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
15910 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
15920 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
15930 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
15940 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  this b-tree */. 
15950 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
15960 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
15970 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
15980 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
15990 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
159a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
159b0 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
159c0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
159d0 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
159e0 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
159f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
15a00 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
15a10 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
15a20 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
15a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15a40 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
15a50 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
15a60 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
15a70 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
15a80 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
15a90 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  () */.){.  BtSha
15aa0 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
15ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
15ac0 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
15ad0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
15ae0 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
15b10 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
15b20 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
15b30 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
15b40 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
15b50 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
15b60 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
15b70 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15b80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
15b90 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
15ba0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
15bb0 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15bd0 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
15be0 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
15bf0 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
15c00 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
15c10 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
15c20 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
15c30 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69   */..  /* True i
15c40 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68  f opening an eph
15c50 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72  emeral, temporar
15c60 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
15c70 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70  const int isTemp
15c80 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  Db = zFilename==
15c90 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
15ca0 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ]==0;..  /* Set 
15cb0 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
15cc0 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
15cd0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
15ce0 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
15cf0 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
15d00 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
15d10 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
15d20 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
15d30 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  DB.  const int i
15d40 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73  sMemdb = 0;.#els
15d50 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
15d60 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61  Memdb = (zFilena
15d70 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69  me && strcmp(zFi
15d80 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
15d90 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  :")==0).        
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
15db0 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73  | (isTempDb && s
15dc0 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
15dd0 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20  ry(db)).        
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
15df0 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  | (vfsFlags & SQ
15e00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
15e10 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )!=0;.#endif..  
15e20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
15e30 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21  .  assert( pVfs!
15e40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15e50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15e60 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
15e70 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
15e80 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29  s&0xff)==flags )
15e90 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74  ;   /* flags fit
15ea0 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20   in 8 bits */.. 
15eb0 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45   /* Only a BTREE
15ec0 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
15ed0 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e   can be BTREE_UN
15ee0 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73  ORDERED */.  ass
15ef0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
15f00 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d  REE_UNORDERED)==
15f10 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54  0 || (flags & BT
15f20 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29  REE_SINGLE)!=0 )
15f30 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f  ;..  /* A BTREE_
15f40 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
15f50 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70  is always a temp
15f60 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68  orary and/or eph
15f70 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65  emeral */.  asse
15f80 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
15f90 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c  EE_SINGLE)==0 ||
15fa0 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20   isTempDb );..  
15fb0 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
15fc0 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
15fd0 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
15fe0 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
15ff0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
16000 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65  _DB)!=0 && (isMe
16010 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29  mdb || isTempDb)
16020 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
16030 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
16040 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
16050 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
16060 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
16070 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
16080 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
16090 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
160a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
160b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
160c0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
160d0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
160e0 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
160f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16100 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16110 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
16120 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
16130 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
16140 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
16150 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
16160 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
16170 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16180 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
16190 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
161a0 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
161b0 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
161c0 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
161d0 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
161e0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
161f0 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
16200 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
16210 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26  f( isTempDb==0 &
16220 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c  & (isMemdb==0 ||
16230 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
16240 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20  E_OPEN_URI)!=0) 
16250 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c  ){.    if( vfsFl
16260 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
16270 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b  N_SHAREDCACHE ){
16280 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  .      int nFile
16290 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
162a0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
162b0 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  )+1;.      int n
162c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
162d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
162e0 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
162f0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
16300 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58  qlite3Malloc(MAX
16310 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e  (nFullPathname,n
16320 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
16330 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
16340 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
16350 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20  texShared; )..  
16360 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
16370 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
16380 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
16390 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
163a0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
163b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
163c0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
163d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
163e0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
163f0 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
16400 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
16410 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
16420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16440 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
16450 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
16490 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
164a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
164b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
164c0 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
164d0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
164e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
164f0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
16500 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16510 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
16520 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
16530 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
16540 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
16550 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
16560 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
16570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
16580 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
16590 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
165a0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
165b0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
165c0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
165d0 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
165e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
165f0 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
16600 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
16610 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
16620 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
16630 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
16640 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
16650 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
16660 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
16670 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
16680 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
16690 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
166a0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
166b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
166c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166d0 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
166e0 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
166f0 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
16700 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
16710 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
16720 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
16730 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
16740 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
16750 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
16760 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
16770 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
16780 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
16790 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
167b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
167c0 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
167e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
167f0 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
16800 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16810 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
16820 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
16830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
16840 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
16850 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16860 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
16870 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
16880 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16890 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
168a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
168b0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
168c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
168d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
168e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
168f0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
16900 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
16910 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
16920 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
16930 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
16940 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
16950 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
16960 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
16970 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
16980 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
16990 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
169a0 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
169b0 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
169c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
169d0 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
169e0 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
169f0 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
16a00 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
16a10 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
16a20 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
16a30 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
16a40 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
16a50 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
16a60 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
16a70 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
16a80 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
16a90 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
16aa0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
16ab0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
16ac0 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
16ad0 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
16ae0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
16af0 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
16b00 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
16b10 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
16b20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
16b30 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
16b40 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
16b50 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
16b60 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16b70 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
16b80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16b90 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
16ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
16bb0 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
16bc0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16bd0 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
16be0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16bf0 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
16c00 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
16c10 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
16c20 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
16c30 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
16c40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16c50 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
16c60 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
16c70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
16c80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16c90 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
16ca0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
16cb0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
16ce0 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
16cf0 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
16d00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
16d20 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
16d30 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
16d40 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
16d50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
16d60 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
16d70 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
16d80 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
16d90 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
16da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16db0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16dc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
16dd0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
16de0 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
16df0 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
16e00 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
16e10 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
16e20 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64 6c  agerSetBusyHandl
16e30 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
16e40 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
16e50 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
16e60 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
16e70 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
16e80 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
16e90 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
16ea0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
16eb0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
16ec0 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
16ed0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16ee0 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20  _READ_ONLY;.#if 
16ef0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53  defined(SQLITE_S
16f00 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20  ECURE_DELETE).  
16f10 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
16f20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
16f30 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66 69  LETE;.#elif defi
16f40 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54 5f  ned(SQLITE_FAST_
16f50 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20  SECURE_DELETE). 
16f60 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
16f70 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49 54   |= BTS_OVERWRIT
16f80 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  E;.#endif.    /*
16f90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
16fa0 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
16fb0 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
16fc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
16fd0 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
16fe0 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
16ff0 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
17000 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
17010 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
17020 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
17030 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
17040 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
17050 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
17060 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c   (zDbHeader[16]<
17070 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72  <8) | (zDbHeader
17080 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69  [17]<<16);.    i
17090 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
170a0 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
170b0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
170c0 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
170d0 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
170e0 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
170f0 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
17100 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
17110 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ze = 0;.#ifndef 
17120 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
17130 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
17140 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
17150 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
17160 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
17170 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
17180 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
17190 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
171a0 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
171b0 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
171c0 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
171d0 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
171e0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
171f0 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
17200 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
17210 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
17220 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
17230 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
17240 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
17250 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
17260 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
17270 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
17280 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
17290 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
172a0 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
172b0 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
172c0 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
172d0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
172e0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
172f0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
17300 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
17310 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
17320 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
17330 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
17340 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
17350 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
17360 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
17370 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
17380 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
17390 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d  NCE-OF: R-37497-
173a0 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f  42412 The size o
173b0 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72  f the reserved r
173c0 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a  egion is.      *
173d0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
173e0 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73  the one-byte uns
173f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f  igned integer fo
17400 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  und at an offset
17410 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20   of 20.      ** 
17420 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17430 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
17440 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  /.      nReserve
17450 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
17460 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
17470 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
17480 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
17490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
174a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
174b0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
174c0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
174d0 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
174e0 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
174f0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
17500 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
17510 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
17520 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
17530 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
17540 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
17550 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
17560 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
17570 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
17580 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
17590 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
175a0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
175b0 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
175c0 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
175d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
175e0 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
175f0 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
17600 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
17610 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69  geSize */.   .#i
17620 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
17630 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
17640 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
17650 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
17660 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
17670 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
17680 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
17690 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
176a0 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
176b0 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e     */.    pBt->n
176c0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Ref = 1;.    if(
176d0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
176e0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
176f0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
17700 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
17710 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
17720 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
17730 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
17740 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
17750 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
17760 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
17770 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
17780 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
17790 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
177a0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
177b0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
177c0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
177d0 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
177e0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
177f0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
17800 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17810 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
17820 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
17830 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
17840 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17850 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
17860 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
17870 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
17880 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
17890 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
178a0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
178b0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
178c0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
178d0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
178e0 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
178f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
17900 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
17910 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
17920 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
17930 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
17940 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
17950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17960 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
17970 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
17980 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
17990 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
179a0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
179b0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
179c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
179d0 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
179e0 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
179f0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
17a00 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
17a10 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
17a20 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
17a30 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
17a40 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
17a50 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
17a60 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
17a70 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
17a80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
17a90 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
17aa0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
17ab0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
17ac0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
17ad0 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
17ae0 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
17af0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75 70  .        if( (up
17b00 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29  tr)p->pBt<(uptr)
17b10 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
17b20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
17b30 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
17b40 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
17b50 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
17b60 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
17b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17b80 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
17b90 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72 29  >pNext && (uptr)
17ba0 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
17bb0 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b  <(uptr)p->pBt ){
17bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
17bd0 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
17be0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17bf0 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
17c00 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
17c10 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
17c20 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
17c30 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
17c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17c50 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
17c60 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
17c70 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
17c80 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
17c90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
17ca0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
17cb0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
17cc0 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
17cd0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
17ce0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17cf0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
17d00 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
17d10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17d20 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
17d30 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  >pPager, 0);.   
17d40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
17d50 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
17d60 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
17d70 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
17d80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
17d90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
17da0 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  e;..    /* If th
17db0 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63  e B-Tree was suc
17dc0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
17dd0 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d  , set the pager-
17de0 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68  cache size to th
17df0 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
17e00 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
17e10 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20  when opening on 
17e20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72  an existing shar
17e30 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a  ed pager-cache,.
17e40 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68      ** do not ch
17e50 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63  ange the pager-c
17e60 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  ache size..    *
17e70 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
17e80 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20  3BtreeSchema(p, 
17e90 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0, 0)==0 ){.    
17ea0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
17eb0 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42  tCachesize(p->pB
17ec0 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54  t->pPager, SQLIT
17ed0 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
17ee0 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  SIZE);.    }..  
17ef0 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    pFile = sqlite
17f00 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
17f10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
17f20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
17f30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17f40 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
17f50 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  nt(pFile, SQLITE
17f60 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69  _FCNTL_PDB, (voi
17f70 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20  d*)&pBt->db);.  
17f80 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
17f90 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
17fa0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17fb0 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
17fc0 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
17fd0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
17fe0 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
17ff0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
18000 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
18010 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f  e3BtreeConnectio
18020 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29  nCount(*ppBtree)
18030 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >0 );.  return r
18040 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  c;.}../*.** Decr
18050 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72  ement the BtShar
18060 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e  ed.nRef counter.
18070 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
18080 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76  s zero,.** remov
18090 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  e the BtShared s
180a0 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
180b0 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20  e sharing list. 
180c0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
180d0 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  if the BtShared.
180e0 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61  nRef counter rea
180f0 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65  ches zero and re
18100 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66  turn.** false if
18110 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73   it is still pos
18120 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  itive..*/.static
18130 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53   int removeFromS
18140 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61  haringList(BtSha
18150 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64  red *pBt){.#ifnd
18160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
18170 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55  HARED_CACHE.  MU
18180 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
18190 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
181a0 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20  r; ).  BtShared 
181b0 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
181c0 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
181d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
181e0 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
181f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54  >mutex) );.  MUT
18200 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
18210 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
18220 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
18230 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
18240 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
18250 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
18260 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
18270 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
18280 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
18290 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
182a0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
182b0 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
182c0 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
182d0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
182e0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
182f0 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
18300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18310 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
18320 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
18330 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
18340 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
18350 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
18360 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
18370 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
18380 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
18390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
183a0 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
183b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
183c0 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
183d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
183e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
183f0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
18400 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18410 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
18420 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
18430 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
18440 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
18450 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
18460 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
18470 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
18480 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
18490 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
184a0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
184b0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
184c0 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
184d0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
184e0 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20 34  ) bytes with a 4
184f0 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f 72  -byte prefix for
18500 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a   a left-child.**
18510 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
18520 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
18530 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
18540 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
18550 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
18560 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
18570 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
18580 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
18590 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20  >pageSize );..  
185a0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
185b0 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d  uses of pBt->pTm
185c0 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72  pSpace is to for
185d0 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  mat cells before
185e0 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e  .    ** insertin
185f0 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65  g them into a le
18600 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f  af page (functio
18610 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e  n fillInCell()).
18620 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c   If.    ** a cel
18630 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34  l is less than 4
18640 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
18650 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70  it is rounded up
18660 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20   to 4 bytes.    
18670 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75  ** by the variou
18680 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  s routines that 
18690 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72  manipulate binar
186a0 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20  y cells. Which. 
186b0 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74     ** can mean t
186c0 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  hat fillInCell()
186d0 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65   only initialize
186e0 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72  s the first 2 or
186f0 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20   3.    ** bytes 
18700 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75  of pTmpSpace, bu
18710 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  t that the first
18720 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70   4 bytes are cop
18730 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ied from.    ** 
18740 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61  it into a databa
18750 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73  se page. This is
18760 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20   not actually a 
18770 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a  problem, but it.
18780 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73      ** does caus
18790 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72  e a valgrind err
187a0 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72  or when the 1 or
187b0 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74   2 bytes of unit
187c0 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20  ialized .    ** 
187d0 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74  data is passed t
187e0 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72  o system call wr
187f0 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f  ite(). So to avo
18800 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20  id this error,. 
18810 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66     ** zero the f
18820 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
18830 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e  temp space here.
18840 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
18850 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f  lso:  Provide fo
18860 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74  ur bytes of init
18870 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65  ialized space be
18880 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
18890 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d  beginning of pTm
188a0 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72 65  pSpace as an are
188b0 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70  a available to p
188c0 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a  repend the.    *
188d0 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69  * left-child poi
188e0 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69  nter to the begi
188f0 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e  nning of a cell.
18900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18910 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
18920 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
18930 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30  Bt->pTmpSpace, 0
18940 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  , 8);.      pBt-
18950 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b  >pTmpSpace += 4;
18960 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
18970 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
18980 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
18990 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
189a0 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
189b0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
189c0 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  t){.  if( pBt->p
189d0 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
189e0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d  pBt->pTmpSpace -
189f0 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 4;.    sqlite3
18a00 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54  PageFree(pBt->pT
18a10 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42  mpSpace);.    pB
18a20 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30  t->pTmpSpace = 0
18a30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
18a40 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
18a50 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
18a60 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
18a70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18a80 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
18a90 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
18aa0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18ab0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
18ac0 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
18ad0 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
18ae0 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
18af0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18b00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18b10 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
18b20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
18b30 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
18b40 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
18b50 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
18b60 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
18b70 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
18b80 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
18b90 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
18ba0 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
18bb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
18bc0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
18bd0 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
18be0 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
18bf0 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
18c00 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
18c10 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
18c20 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
18c30 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
18c40 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
18c50 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
18c60 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
18c70 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
18c80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
18c90 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c  eRollback(p, SQL
18ca0 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71  ITE_OK, 0);.  sq
18cb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18cc0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
18cd0 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
18ce0 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
18cf0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
18d00 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
18d10 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
18d20 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
18d30 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
18d40 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
18d50 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
18d60 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
18d70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
18d80 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
18d90 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
18da0 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
18db0 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
18dc0 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
18dd0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
18de0 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
18df0 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
18e00 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
18e10 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
18e20 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
18e30 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
18e40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
18e50 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
18e60 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
18e70 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
18e80 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
18e90 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
18ea0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
18eb0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  se(pBt->pPager, 
18ec0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  p->db);.    if( 
18ed0 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
18ee0 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
18ef0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
18f00 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
18f10 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
18f20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18f30 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
18f40 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
18f50 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
18f60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
18f70 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
18f80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
18f90 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
18fa0 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
18fb0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
18fc0 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
18fd0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
18fe0 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
18ff0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
19000 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
19010 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
19020 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
19030 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
19040 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
19050 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19060 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73  ** Change the "s
19070 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  oft" limit on th
19080 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
19090 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
190a0 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e  ** Unused and un
190b0 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77  modified pages w
190c0 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20  ill be recycled 
190d0 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
190e0 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  of.** pages in t
190f0 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73  he cache exceeds
19100 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74   this soft limit
19110 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20  .  But the size 
19120 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20  of the.** cache 
19130 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72  is allowed to gr
19140 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ow larger than t
19150 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20  his limit if it 
19160 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74  contains.** dirt
19170 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73  y pages or pages
19180 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65   still in active
19190 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
191a0 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
191b0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
191c0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
191d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
191e0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
191f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19200 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
19210 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
19220 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
19230 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
19240 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
19250 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
19260 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19270 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
19280 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19290 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73  ** Change the "s
192a0 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74  pill" limit on t
192b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
192c0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
192d0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
192e0 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65  r of pages excee
192f0 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75  ds this limit du
19300 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61  ring a write tra
19310 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65  nsaction,.** the
19320 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74   pager might att
19330 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20  empt to "spill" 
19340 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  pages to the jou
19350 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a  rnal early in.**
19360 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
19370 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  p memory..**.** 
19380 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
19390 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e  ed is the curren
193a0 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49  t spill size.  I
193b0 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64  f zero is passed
193c0 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  .** as an argume
193d0 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  nt, no changes a
193e0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73  re made to the s
193f0 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e  pill size settin
19400 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d  g, so.** using m
19410 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20  xPage of 0 is a 
19420 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65  way to query the
19430 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
19440 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ize..*/.int sqli
19450 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c  te3BtreeSetSpill
19460 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
19470 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
19480 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19490 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b  >pBt;.  int res;
194a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
194b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
194c0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
194d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
194e0 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73  er(p);.  res = s
194f0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70  qlite3PagerSetSp
19500 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  illsize(pBt->pPa
19510 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
19520 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19530 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
19540 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  es;.}..#if SQLIT
19550 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
19560 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  0./*.** Change t
19570 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
19580 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61  amount of the da
19590 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74  tabase file that
195a0 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72   may be.** memor
195b0 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74  y mapped..*/.int
195c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
195d0 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20  MmapLimit(Btree 
195e0 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  *p, sqlite3_int6
195f0 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53  4 szMmap){.  BtS
19600 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19610 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
19620 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19630 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
19640 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19650 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
19660 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
19670 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
19680 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71  r, szMmap);.  sq
19690 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
196a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
196b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
196c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
196d0 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
196e0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
196f0 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
19700 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
19710 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
19720 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
19730 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
19740 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
19750 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
19760 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
19770 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
19780 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
19790 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
197a0 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
197b0 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
197c0 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
197d0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
197e0 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
197f0 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
19800 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
19810 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
19820 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
19830 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
19840 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
19850 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
19860 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
19870 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
19880 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
19890 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
198a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
198b0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
198c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
198d0 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20  etPagerFlags(.  
198e0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
198f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
19900 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73  ree to set the s
19910 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a  afety level on *
19920 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
19930 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61  lags       /* Va
19940 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c  rious PAGER_* fl
19950 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ags */.){.  BtSh
19960 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19970 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
19980 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19990 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
199a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
199b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
199c0 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
199d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
199e0 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  Flags);.  sqlite
199f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19a00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19a10 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
19a20 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
19a30 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
19a40 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
19a50 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
19a60 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
19a70 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
19a80 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
19a90 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
19aa0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
19ab0 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
19ac0 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
19ad0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
19ae0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
19af0 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
19b00 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
19b10 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
19b20 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
19b30 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
19b40 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
19b50 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
19b60 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
19b70 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
19b80 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
19b90 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
19ba0 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
19bb0 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
19bc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19bd0 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
19be0 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
19bf0 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
19c00 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
19c10 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
19c20 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
19c30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
19c40 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
19c50 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
19c60 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
19c70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
19c80 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
19c90 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
19ca0 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
19cb0 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
19cc0 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
19cd0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
19ce0 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
19cf0 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45  the BTS_PAGESIZE
19d00 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73  _FIXED flag is s
19d10 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
19d20 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
19d30 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
19d40 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
19d50 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
19d60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
19d70 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
19d80 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
19d90 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
19da0 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
19db0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19dc0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19dd0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
19de0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
19df0 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
19e00 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
19e10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
19e20 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
19e30 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  C.  if( nReserve
19e40 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
19e50 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69  erve ) pBt->opti
19e60 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38  malReserve = (u8
19e70 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69  )nReserve;.#endi
19e80 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  f.  if( pBt->bts
19e90 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
19ea0 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20  SIZE_FIXED ){.  
19eb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19ec0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
19ed0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
19ee0 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
19ef0 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
19f00 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
19f10 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
19f20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
19f30 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
19f40 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
19f50 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20  e<=255 );.  if( 
19f60 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
19f70 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
19f80 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
19f90 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67  &&.        ((pag
19fa0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
19fb0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
19fc0 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
19fd0 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73   7)==0 );.    as
19fe0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
19ff0 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  sor );.    pBt->
1a000 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29  pageSize = (u32)
1a010 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
1a020 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
1a030 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1a040 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
1a050 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
1a060 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
1a070 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70  , nReserve);.  p
1a080 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
1a090 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
1a0a0 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (u16)nReserve;.
1a0b0 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74    if( iFix ) pBt
1a0c0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1a0d0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
1a0e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a0f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1a100 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a110 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1a120 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
1a130 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
1a140 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1a150 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
1a160 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
1a170 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
1a180 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a190 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
1a1a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a1b0 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70  Reserve(), excep
1a1c0 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79  t that it.** may
1a1d0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
1a1e0 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  if it is guarant
1a1f0 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74  eed that the b-t
1a200 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72  ree mutex is alr
1a210 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a  eady.** held..**
1a220 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66  .** This is usef
1a230 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61  ul in one specia
1a240 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61  l case in the ba
1a250 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68  ckup API code wh
1a260 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f  ere it is.** kno
1a270 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72  wn that the shar
1a280 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
1a290 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65  is held, but the
1a2a0 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a   mutex on the .*
1a2b0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1a2c0 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69  e that owns *p i
1a2d0 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63  s not. In this c
1a2e0 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74  ase if sqlite3Bt
1a2f0 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65  reeEnter().** we
1a300 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c  re to be called,
1a310 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64   it might collid
1a320 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65  e with some othe
1a330 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74  r operation on t
1a340 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
1a350 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
1a360 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65  *p, causing unde
1a370 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a  fined behavior..
1a380 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a390 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
1a3a0 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a  utex(Btree *p){.
1a3b0 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72    int n;.  asser
1a3c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1a3d0 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
1a3e0 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d  tex) );.  n = p-
1a3f0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
1a400 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
1a410 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ize;.  return n;
1a420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a430 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1a440 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
1a450 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
1a460 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
1a470 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
1a480 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
1a490 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
1a4a0 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
1a4b0 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
1a4c0 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
1a4d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  s..**.** If SQLI
1a4e0 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20  TE_HAS_MUTEX is 
1a4f0 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65  defined then the
1a500 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
1a510 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74   is the.** great
1a520 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  er of the curren
1a530 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  t reserved space
1a540 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
1a550 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65   requested.** re
1a560 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a  serve space..*/.
1a570 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a580 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76  GetOptimalReserv
1a590 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
1a5a0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
1a5b0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a5c0 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  n = sqlite3Btree
1a5d0 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
1a5e0 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  x(p);.#ifdef SQL
1a5f0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
1a600 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70  if( n<p->pBt->op
1a610 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e  timalReserve ) n
1a620 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   = p->pBt->optim
1a630 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69  alReserve;.#endi
1a640 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  f.  sqlite3Btree
1a650 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1a660 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
1a670 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
1a680 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
1a690 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
1a6a0 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
1a6b0 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
1a6c0 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
1a6d0 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
1a6e0 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
1a6f0 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
1a700 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
1a710 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
1a720 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
1a730 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
1a740 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
1a750 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
1a760 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
1a770 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a780 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
1a790 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
1a7a0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
1a7b0 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
1a7c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a7d0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
1a7e0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1a7f0 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
1a800 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
1a810 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  E and BTS_OVERWR
1a820 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a  ITE flags:.**.**
1a830 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20      newFlag==0  
1a840 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53 45       Both BTS_SE
1a850 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20  CURE_DELETE and 
1a860 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61 72  BTS_OVERWRITE ar
1a870 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20  e cleared.**    
1a880 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20 20  newFlag==1      
1a890 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
1a8a0 54 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f 4f  TE set and BTS_O
1a8b0 56 45 52 57 52 49 54 45 20 69 73 20 63 6c 65 61  VERWRITE is clea
1a8c0 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  red.**    newFla
1a8d0 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f 53  g==2       BTS_S
1a8e0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c 65  ECURE_DELETE cle
1a8f0 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56 45  ared and BTS_OVE
1a900 52 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a 2a  RWRITE is set.**
1a910 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31      newFlag==(-1
1a920 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a  )    No changes.
1a930 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a940 6e 65 20 61 63 74 73 20 61 73 20 61 20 71 75 65  ne acts as a que
1a950 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ry if newFlag is
1a960 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a   less than zero.
1a970 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f  **.** With BTS_O
1a980 56 45 52 57 52 49 54 45 20 73 65 74 2c 20 64 65  VERWRITE set, de
1a990 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73  leted content is
1a9a0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20   overwritten by 
1a9b0 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72  zeros, but.** fr
1a9c0 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  eelist leaf page
1a9d0 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74 65  s are not writte
1a9e0 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61  n back to the da
1a9f0 74 61 62 61 73 65 2e 20 20 54 68 75 73 20 69 6e  tabase.  Thus in
1aa00 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64  -page.** deleted
1aa10 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65 61   content is clea
1aa20 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69 73  red, but freelis
1aa30 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e  t deleted conten
1aa40 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  t is not..**.** 
1aa50 57 69 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f  With BTS_SECURE_
1aa60 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69 6f  DELETE, operatio
1aa70 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56  n is like BTS_OV
1aa80 45 52 57 52 49 54 45 20 77 69 74 68 20 74 68 65  ERWRITE with the
1aa90 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61   addition.** tha
1aaa0 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20  t freelist leaf 
1aab0 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
1aac0 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
1aad0 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65 61  database, increa
1aae0 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75  sing.** the amou
1aaf0 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a  nt of disk I/O..
1ab00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ab10 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
1ab20 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65  Btree *p, int ne
1ab30 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b  wFlag){.  int b;
1ab40 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1ab50 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
1ab60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1ab70 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f 56    assert( BTS_OV
1ab80 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45 43  ERWRITE==BTS_SEC
1ab90 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a  URE_DELETE*2 );.
1aba0 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 46 41    assert( BTS_FA
1abb0 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53 5f  ST_SECURE==(BTS_
1abc0 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53 45  OVERWRITE|BTS_SE
1abd0 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a  CURE_DELETE) );.
1abe0 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30    if( newFlag>=0
1abf0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e   ){.    p->pBt->
1ac00 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1ac10 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20 20  _FAST_SECURE;.  
1ac20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
1ac30 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
1ac40 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b  _DELETE*newFlag;
1ac50 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70  .  }.  b = (p->p
1ac60 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1ac70 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29 2f  TS_FAST_SECURE)/
1ac80 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
1ac90 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  E;.  sqlite3Btre
1aca0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1acb0 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn b;.}../*.** 
1acc0 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
1acd0 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
1ace0 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
1acf0 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
1ad00 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
1ad10 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
1ad20 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
1ad30 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
1ad40 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
1ad50 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
1ad60 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
1ad70 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
1ad80 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
1ad90 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
1ada0 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
1adb0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
1adc0 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
1add0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
1ade0 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
1adf0 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
1ae00 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
1ae10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ae20 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
1ae30 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
1ae40 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
1ae50 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
1ae60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ae70 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
1ae80 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
1ae90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1aea0 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d  (p);.  if( (pBt-
1aeb0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1aec0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21  PAGESIZE_FIXED)!
1aed0 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  =0 && (av ?1:0)!
1aee0 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
1aef0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1af00 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1af10 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
1af20 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
1af30 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
1af40 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
1af50 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
1af60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1af70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1af80 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
1af90 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
1afa0 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
1afb0 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
1afc0 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
1afd0 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
1afe0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1aff0 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
1b000 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
1b010 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
1b020 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
1b030 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b040 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
1b050 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
1b060 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
1b070 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1b080 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1b090 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
1b0a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
1b0b0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
1b0c0 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
1b0d0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
1b0e0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
1b0f0 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
1b100 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
1b110 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
1b120 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1b130 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
1b140 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  if.}../*.** If t
1b150 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20  he user has not 
1b160 73 65 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c  set the safety-l
1b170 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61  evel for this da
1b180 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1b190 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47  n.** using "PRAG
1b1a0 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c  MA synchronous",
1b1b0 20 61 6e 64 20 69 66 20 74 68 65 20 73 61 66 65   and if the safe
1b1c0 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20  ty-level is not 
1b1d0 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74  already.** set t
1b1e0 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
1b1f0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1b200 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ion as the secon
1b210 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20  d parameter,.** 
1b220 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69  set it so..*/.#i
1b230 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1b240 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51  _SYNCHRONOUS!=SQ
1b250 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
1b260 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20  _SYNCHRONOUS \. 
1b270 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53     && !defined(S
1b280 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
1b290 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44  static void setD
1b2a0 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 42  efaultSyncFlag(B
1b2b0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75 38  tShared *pBt, u8
1b2c0 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a   safety_level){.
1b2d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1b2e0 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28 20   Db *pDb;.  if( 
1b2f0 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20  (db=pBt->db)!=0 
1b300 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29  && (pDb=db->aDb)
1b310 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  !=0 ){.    while
1b320 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c  ( pDb->pBt==0 ||
1b330 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d   pDb->pBt->pBt!=
1b340 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a  pBt ){ pDb++; }.
1b350 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79      if( pDb->bSy
1b360 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20 26  ncSet==0 .     &
1b370 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65  & pDb->safety_le
1b380 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76 65  vel!=safety_leve
1b390 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62 21 3d  l .     && pDb!=
1b3a0 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20  &db->aDb[1] .   
1b3b0 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73   ){.      pDb->s
1b3c0 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61  afety_level = sa
1b3d0 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20  fety_level;.    
1b3e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
1b3f0 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
1b400 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  er,.          pD
1b410 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
1b420 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50  | (db->flags & P
1b430 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29  AGER_FLAGS_MASK)
1b440 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
1b450 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65  else.# define se
1b460 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
1b470 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76 65  (pBt,safety_leve
1b480 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f  l).#endif../* Fo
1b490 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1b4a0 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
1b4b0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
1b4c0 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  ared*);.../*.** 
1b4d0 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
1b4e0 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
1b4f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b500 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
1b510 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
1b520 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
1b530 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
1b540 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1b550 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
1b560 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
1b570 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
1b580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1b590 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
1b5a0 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
1b5b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
1b5c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
1b5d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
1b5e0 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
1b5f0 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
1b600 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
1b610 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
1b620 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
1b630 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
1b640 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b660 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
1b670 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
1b680 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1b690 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
1b6a0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
1b6b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20  e file */.  u32 
1b6c0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1b6d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1b6e0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1b6f0 61 73 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ase */.  u32 nPa
1b700 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
1b710 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1b720 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b730 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e   file */.  u32 n
1b740 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
1b750 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1b760 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
1b770 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
1b780 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
1b790 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b7a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1b7b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1b7c0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
1b7d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b7e0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
1b7f0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
1b800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b810 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
1b820 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1b830 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
1b840 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
1b850 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b860 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
1b870 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
1b880 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
1b890 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
1b8a0 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
1b8b0 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
1b8c0 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
1b8d0 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
1b8e0 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
1b8f0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1b900 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
1b910 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1b920 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 2a 29  ->pPager, (int*)
1b930 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
1b940 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
1b950 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
1b960 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
1b970 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1b980 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
1b990 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
1b9a0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 42  e;.  }.  if( (pB
1b9b0 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
1b9c0 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62  QLITE_ResetDatab
1b9d0 61 73 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  ase)!=0 ){.    n
1b9e0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
1b9f0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
1ba00 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
1ba10 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
1ba20 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
1ba30 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
1ba40 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
1ba50 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
1ba60 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1ba70 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76  R-43737-39999 Ev
1ba80 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65  ery valid SQLite
1ba90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1baa0 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74  egins.    ** wit
1bab0 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
1bac0 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78  16 bytes (in hex
1bad0 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37  ): 53 51 4c 69 7
1bae0 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32  4 65 20 66 6f 72
1baf0 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34   6d.    ** 61 74
1bb00 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20   20 33 00. */.  
1bb10 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
1bb20 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
1bb30 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
1bb40 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1bb50 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1bb60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1bb70 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
1bb80 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
1bb90 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1bba0 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
1bbb0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
1bbc0 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
1bbd0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1bbe0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1bbf0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
1bc00 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 33 20  if( page1[18]>3 
1bc10 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
1bc20 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
1bc30 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
1bc40 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
1bc50 3e 33 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >3 ){.      goto
1bc60 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1bc70 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
1bc80 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
1bc90 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
1bca0 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
1bcb0 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
1bcc0 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
1bcd0 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
1bce0 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
1bcf0 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
1bd00 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
1bd10 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
1bd20 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
1bd30 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
1bd40 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
1bd50 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
1bd60 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
1bd70 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
1bd80 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
1bd90 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
1bda0 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
1bdb0 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
1bdc0 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
1bdd0 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
1bde0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
1bdf0 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
1be00 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
1be10 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
1be20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
1be30 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
1be40 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
1be50 3e 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  >=2 && (pBt->bts
1be60 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
1be70 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
1be80 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
1be90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1bea0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
1beb0 42 74 2d 3e 70 50 61 67 65 72 2c 20 28 70 61 67  Bt->pPager, (pag
1bec0 65 31 5b 31 39 5d 3d 3d 33 29 2c 20 26 69 73 4f  e1[19]==3), &isO
1bed0 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
1bee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bef0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
1bf00 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1bf10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bf20 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74        setDefault
1bf30 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51  SyncFlag(pBt, SQ
1bf40 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
1bf50 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
1bf60 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
1bf70 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
1bf80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
1bf90 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ne(pPage1);.    
1bfa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bfb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1bfc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1bfd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
1bfe0 44 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  DB;.    }else{. 
1bff0 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
1c000 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
1c010 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
1c020 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
1c030 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1c040 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c050 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20  15465-20813 The 
1c060 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69  maximum and mini
1c070 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79  mum embedded pay
1c080 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63  load.    ** frac
1c090 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65  tions and the le
1c0a0 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
1c0b0 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ion values must 
1c0c0 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33  be 64, 32, and 3
1c0d0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
1c0e0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
1c0f0 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
1c100 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
1c110 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
1c120 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
1c130 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
1c140 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
1c150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c160 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
1c170 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
1c180 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
1c190 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1c1a0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1c1b0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1c1c0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
1c1d0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
1c1e0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
1c1f0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
1c200 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
1c210 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
1c220 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
1c230 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
1c240 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
1c250 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
1c260 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
1c270 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  /.    pageSize =
1c280 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
1c290 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
1c2a0 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
1c2b0 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32  CE-OF: R-25008-2
1c2c0 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66  1688 The size of
1c2d0 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77   a page is a pow
1c2e0 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a  er of two.    **
1c2f0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
1c300 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65   65536 inclusive
1c310 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  . */.    if( ((p
1c320 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
1c330 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
1c340 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
1c350 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
1c360 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
1c370 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
1c380 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1c390 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1c3a0 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
1c3b0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1c3c0 5a 45 5f 46 49 58 45 44 3b 0a 20 20 20 20 61 73  ZE_FIXED;.    as
1c3d0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
1c3e0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
1c3f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1c400 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
1c410 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
1c420 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
1c430 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
1c440 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
1c450 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1c460 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
1c470 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
1c480 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
1c490 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
1c4a0 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
1c4b0 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
1c4c0 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
1c4d0 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
1c4e0 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
1c4f0 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
1c500 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1c510 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
1c520 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
1c530 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
1c540 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
1c550 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c560 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
1c570 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
1c580 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
1c590 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
1c5a0 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
1c5b0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1c5c0 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
1c5d0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
1c5e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c5f0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
1c600 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
1c610 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
1c620 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
1c630 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
1c640 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
1c650 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
1c660 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
1c670 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
1c680 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1c690 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
1c6a0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
1c6b0 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
1c6c0 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
1c6d0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
1c6e0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
1c6f0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
1c700 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
1c710 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1c720 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1c730 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1c740 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1c750 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
1c760 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1c770 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
1c780 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
1c790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c7a0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1c7b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
1c7c0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c7f0 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
1c800 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
1c810 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c820 69 66 28 20 73 71 6c 69 74 65 33 57 72 69 74 61  if( sqlite3Writa
1c830 62 6c 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 64  bleSchema(pBt->d
1c840 62 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  b)==0 && nPage>n
1c850 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
1c860 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1c870 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1c880 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1c890 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1c8a0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c8b0 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
1c8c0 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
1c8d0 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
1c8e0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
1c8f0 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
1c900 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
1c910 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
1c920 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
1c930 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
1c940 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
1c950 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
1c960 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
1c970 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
1c980 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1c990 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1c9a0 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
1c9b0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1c9c0 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
1c9d0 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
1c9e0 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
1c9f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ca00 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
1ca10 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
1ca20 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
1ca30 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
1ca40 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1ca50 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
1ca60 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
1ca70 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
1ca80 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
1ca90 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
1caa0 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
1cab0 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
1cac0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
1cad0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
1cae0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
1caf0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
1cb00 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
1cb10 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
1cb20 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
1cb30 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
1cb40 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
1cb50 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
1cb60 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
1cb70 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
1cb80 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
1cb90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1cba0 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
1cbb0 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
1cbc0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
1cbd0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
1cbe0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
1cbf0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
1cc00 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
1cc10 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
1cc20 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
1cc30 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
1cc40 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
1cc50 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
1cc60 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
1cc70 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
1cc80 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
1cc90 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
1cca0 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
1ccb0 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
1ccc0 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
1ccd0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
1cce0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1ccf0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
1cd00 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
1cd10 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
1cd20 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1cd30 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
1cd40 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
1cd50 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
1cd60 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
1cd70 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
1cd80 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
1cd90 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
1cda0 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
1cdb0 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
1cdc0 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
1cdd0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
1cde0 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
1cdf0 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1ce00 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
1ce10 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
1ce20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1ce30 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
1ce40 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
1ce50 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
1ce60 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
1ce70 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1ce80 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1ce90 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
1cea0 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
1ceb0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1cec0 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
1ced0 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
1cee0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1cef0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
1cf00 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1cf10 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   of cursors open
1cf20 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73   on pBt. This is
1cf30 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
1cf40 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
1cf50 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
1cf60 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
1cf70 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
1cf80 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  defined..**.** O
1cf90 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
1cfa0 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66  s are counted if
1cfb0 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e   wrOnly is true.
1cfc0 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a    If wrOnly is.*
1cfd0 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c  * false then all
1cfe0 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
1cff0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  nted..**.** For 
1d000 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
1d010 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
1d020 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
1d030 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
1d040 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69  capable of readi
1d050 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  ng or writing to
1d060 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1d070 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20  Cursors that.** 
1d080 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65  have been trippe
1d090 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f  d into the CURSO
1d0a0 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72  R_FAULT state ar
1d0b0 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a  e not counted..*
1d0c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
1d0d0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42  ntValidCursors(B
1d0e0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e  tShared *pBt, in
1d0f0 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  t wrOnly){.  BtC
1d100 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
1d110 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
1d120 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
1d130 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
1d140 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
1d150 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c  if( (wrOnly==0 |
1d160 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  | (pCur->curFlag
1d170 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
1d180 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  ag)!=0).     && 
1d190 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1d1a0 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
1d1b0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
1d1c0 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
1d1d0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1d1e0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
1d1f0 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
1d200 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
1d210 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
1d220 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
1d230 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
1d240 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d250 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
1d260 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
1d270 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1d280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d290 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
1d2a0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
1d2b0 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
1d2c0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
1d2d0 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
1d2e0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1d2f0 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
1d300 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1d310 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1d320 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1d330 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1d340 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d350 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1d360 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1d370 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
1d380 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d  Cursors(pBt,0)==
1d390 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
1d3a0 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
1d3b0 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
1d3c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1d3d0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
1d3e0 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
1d3f0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1d400 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1d410 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1d420 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
1d430 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1d440 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1d450 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
1d460 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   );.    pBt->pPa
1d470 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ge1 = 0;.    rel
1d480 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1d490 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e1);.  }.}../*.*
1d4a0 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
1d4b0 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
1d4c0 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
1d4d0 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
1d4e0 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
1d4f0 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
1d500 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
1d510 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
1d520 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1d530 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
1d540 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
1d550 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
1d560 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
1d570 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
1d580 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1d590 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d5a0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d5b0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
1d5c0 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
1d5d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d5e0 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
1d5f0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
1d600 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
1d610 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
1d620 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
1d630 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
1d640 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
1d650 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1d660 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
1d670 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
1d680 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
1d690 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
1d6a0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
1d6b0 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
1d6c0 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
1d6d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
1d6e0 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
1d6f0 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
1d700 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
1d710 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
1d720 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
1d730 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
1d740 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
1d750 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
1d760 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1d770 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
1d780 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
1d790 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
1d7a0 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
1d7b0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
1d7c0 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
1d7d0 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
1d7e0 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
1d7f0 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
1d800 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
1d810 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
1d820 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
1d830 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
1d840 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
1d850 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
1d860 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
1d870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1d880 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
1d890 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1d8a0 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
1d8b0 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
1d8c0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
1d8d0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1d8e0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
1d8f0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1d900 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
1d910 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1d920 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1d930 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
1d940 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
1d950 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61  endif.  pBt->nPa
1d960 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33  ge = 1;.  data[3
1d970 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  1] = 1;.  return
1d980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d990 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1d9a0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1d9b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1d9c0 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20  ile (creating a 
1d9d0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73  database.** cons
1d9e0 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
1d9f0 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73  le page and no s
1da00 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20  chema objects). 
1da10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1da20 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75  .** if successfu
1da30 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
1da40 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1da50 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
1da60 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42  ite3BtreeNewDb(B
1da70 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1da80 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1da90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
1daa0 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  >pBt->nPage = 0;
1dab0 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62  .  rc = newDatab
1dac0 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73  ase(p->pBt);.  s
1dad0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1dae0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1daf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
1db00 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
1db10 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
1db20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1db30 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
1db40 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1db50 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
1db60 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
1db70 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
1db80 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
1db90 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1dba0 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
1dbb0 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
1dbc0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
1dbd0 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
1dbe0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
1dbf0 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
1dc00 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1dc10 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
1dc20 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
1dc30 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
1dc40 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
1dc50 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
1dc60 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
1dc70 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
1dc80 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
1dc90 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
1dca0 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
1dcb0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1dcc0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1dcd0 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
1dce0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
1dcf0 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
1dd00 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1dd10 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
1dd20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1dd30 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
1dd40 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
1dd50 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1dd60 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
1dd70 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1dd80 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
1dd90 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1dda0 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
1ddb0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ddc0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
1ddd0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1dde0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
1ddf0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1de00 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
1de10 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1de20 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
1de30 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1de40 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
1de50 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
1de60 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
1de70 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
1de80 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
1de90 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
1dea0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
1deb0 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
1dec0 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
1ded0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1dee0 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
1def0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
1df00 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
1df10 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
1df20 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
1df30 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1df40 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
1df50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
1df60 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
1df70 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1df80 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
1df90 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1dfa0 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
1dfb0 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
1dfc0 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
1dfd0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
1dfe0 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
1dff0 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
1e000 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
1e010 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1e020 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
1e030 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
1e040 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
1e050 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
1e060 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
1e070 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1e080 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
1e090 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
1e0a0 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
1e0b0 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
1e0c0 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
1e0d0 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
1e0e0 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
1e0f0 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
1e100 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
1e110 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
1e120 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
1e130 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
1e140 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1e150 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
1e160 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
1e170 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
1e180 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
1e190 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1e1a0 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
1e1b0 2c 20 69 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e  , int wrflag, in
1e1c0 74 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69 6f  t *pSchemaVersio
1e1d0 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  n){.  BtShared *
1e1e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e1f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e200 4f 4b 3b 0a 20 20 69 6e 74 20 62 43 6f 6e 63 75  OK;.  int bConcu
1e210 72 72 65 6e 74 20 3d 20 28 70 2d 3e 64 62 2d 3e  rrent = (p->db->
1e220 62 43 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 21  bConcurrent && !
1e230 49 53 41 55 54 4f 56 41 43 55 55 4d 29 3b 0a 0a  ISAUTOVACUUM);..
1e240 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1e250 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1e260 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1e270 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
1e280 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1e290 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1e2a0 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
1e2b0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
1e2c0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
1e2d0 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
1e2e0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
1e2f0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
1e300 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1e310 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1e320 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1e330 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
1e340 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
1e350 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
1e360 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1e370 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1e380 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1e390 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66  RANS_WRITE || If
1e3a0 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
1e3b0 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
1e3c0 3b 0a 0a 20 20 69 66 28 20 28 70 2d 3e 64 62 2d  ;..  if( (p->db-
1e3d0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1e3e0 52 65 73 65 74 44 61 74 61 62 61 73 65 29 20 0a  ResetDatabase) .
1e3f0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
1e400 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
1e410 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 0a 20 20  ->pPager)==0 .  
1e420 29 7b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  ){.    pBt->btsF
1e430 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 52 45 41  lags &= ~BTS_REA
1e440 44 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f  D_ONLY;.  }..  /
1e450 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
1e460 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
1e470 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
1e480 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1e490 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
1e4a0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1e4b0 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
1e4c0 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
1e4d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1e4e0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
1e4f0 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
1e500 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e510 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b  SHARED_CACHE.  {
1e520 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42  .    sqlite3 *pB
1e530 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  lock = 0;.    /*
1e540 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
1e550 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
1e560 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
1e570 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1e580 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  on .    ** on th
1e590 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
1e5a0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
1e5b0 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
1e5c0 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20  nsaction is.    
1e5d0 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
1e5e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
1e5f0 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ED..    */.    i
1e600 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
1e610 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1e620 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20  ==TRANS_WRITE). 
1e630 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73      || (pBt->bts
1e640 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44  Flags & BTS_PEND
1e650 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  ING)!=0.    ){. 
1e660 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42       pBlock = pB
1e670 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
1e680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
1e690 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20  flag>1 ){.      
1e6a0 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
1e6b0 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70       for(pIter=p
1e6c0 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1e6d0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1e6e0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
1e6f0 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
1e700 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=p ){.         
1e710 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
1e720 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
1e730 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e750 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1e760 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  lock ){.      sq
1e770 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
1e780 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
1e790 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20  lock);.      rc 
1e7a0 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
1e7b0 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
1e7c0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
1e7d0 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  gun;.    }.  }.#
1e7e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
1e7f0 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
1e800 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
1e810 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
1e820 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
1e830 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
1e840 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
1e850 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
1e860 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
1e870 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
1e880 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
1e890 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
1e8a0 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
1e8b0 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
1e8c0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1e8d0 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
1e8e0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
1e8f0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
1e900 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1e910 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  ;..  pBt->btsFla
1e920 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49  gs &= ~BTS_INITI
1e930 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66  ALLY_EMPTY;.  if
1e940 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20  ( pBt->nPage==0 
1e950 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1e960 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  |= BTS_INITIALLY
1e970 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20  _EMPTY;.  do {. 
1e980 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
1e990 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
1e9a0 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
1e9b0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
1e9c0 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
1e9d0 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1e9e0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
1e9f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
1ea00 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
1ea10 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1ea20 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
1ea30 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
1ea40 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
1ea50 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
1ea60 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
1ea70 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
1ea80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ea90 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
1eaa0 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
1eab0 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
1eac0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
1ead0 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
1eae0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
1eaf0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
1eb00 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1eb10 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
1eb20 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
1eb30 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
1eb40 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
1eb50 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
1eb60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1eb70 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
1eb80 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e        if( (pBt->
1eb90 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1eba0 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  EAD_ONLY)!=0 ){.
1ebb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ebc0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1ebd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ebe0 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20 3d 20     int exFlag = 
1ebf0 62 43 6f 6e 63 75 72 72 65 6e 74 20 3f 20 2d 31  bConcurrent ? -1
1ec00 20 3a 20 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20   : (wrflag>1);. 
1ec10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ec20 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
1ec30 74 2d 3e 70 50 61 67 65 72 2c 20 65 78 46 6c 61  t->pPager, exFla
1ec40 67 2c 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  g, sqlite3TempIn
1ec50 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
1ec60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1ec70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ec80 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
1ec90 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1eca0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ecb0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f  rc==SQLITE_BUSY_
1ecc0 53 4e 41 50 53 48 4f 54 20 26 26 20 70 42 74 2d  SNAPSHOT && pBt-
1ecd0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1ece0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1ecf0 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68          /* if th
1ed00 65 72 65 20 77 61 73 20 6e 6f 20 74 72 61 6e 73  ere was no trans
1ed10 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68  action opened wh
1ed20 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1ed30 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1ed40 2a 20 63 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c  * called and SQL
1ed50 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
1ed60 54 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 63  T is returned, c
1ed70 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 0a  hange the error.
1ed80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1ed90 65 20 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59  e to SQLITE_BUSY
1eda0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1edb0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1edc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1edd0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1ede0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1edf0 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
1ee00 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1ee10 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
1ee20 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
1ee30 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1ee40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1ee50 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1ee60 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
1ee70 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
1ee80 72 28 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69  r(pBt) );.  sqli
1ee90 74 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63  te3PagerResetLoc
1eea0 6b 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50  kTimeout(pBt->pP
1eeb0 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63  ager);..  if( rc
1eec0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1eed0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1eee0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
1eef0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1ef00 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
1ef10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ef20 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1ef30 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
1ef40 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
1ef50 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
1ef60 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
1ef70 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
1ef80 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1ef90 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
1efa0 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
1efb0 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
1efc0 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
1efd0 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
1efe0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
1eff0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
1f000 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
1f010 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
1f020 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
1f030 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1f040 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1f050 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
1f060 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1f070 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
1f080 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
1f090 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
1f0a0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1f0b0 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
1f0c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1f0d0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1f0e0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
1f0f0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
1f100 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
1f110 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
1f120 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
1f130 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
1f140 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
1f150 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1f160 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
1f170 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
1f180 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
1f190 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
1f1a0 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
1f1b0 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
1f1c0 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
1f1d0 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
1f1e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f1f0 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
1f200 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
1f210 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
1f220 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
1f230 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1f240 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
1f250 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
1f260 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
1f270 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
1f280 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
1f290 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
1f2a0 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
1f2b0 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
1f2c0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
1f2d0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1f2e0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1f2f0 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
1f300 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
1f310 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1f320 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f330 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1f340 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1f350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f360 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1f370 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1f380 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1f390 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1f3a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f3b0 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 23 69  .trans_begun:.#i
1f3c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f3d0 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69  T_CONCURRENT.  i
1f3e0 66 28 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 26  f( bConcurrent &
1f3f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1f400 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  && sqlite3PagerI
1f410 73 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  sWal(pBt->pPager
1f420 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
1f430 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 43  lite3PagerBeginC
1f440 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d 3e 70  oncurrent(pBt->p
1f450 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1f460 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f470 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1f480 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61   rc = btreePtrma
1f490 70 41 6c 6c 6f 63 61 74 65 28 70 42 74 29 3b 0a  pAllocate(pBt);.
1f4a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1f4b0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1f4c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1f4d0 20 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 20   pSchemaVersion 
1f4e0 29 7b 0a 20 20 20 20 20 20 2a 70 53 63 68 65 6d  ){.      *pSchem
1f4f0 61 56 65 72 73 69 6f 6e 20 3d 20 67 65 74 34 62  aVersion = get4b
1f500 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f510 2d 3e 61 44 61 74 61 5b 34 30 5d 29 3b 0a 20 20  ->aData[40]);.  
1f520 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
1f530 61 67 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ag ){.      /* T
1f540 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
1f550 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
1f560 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
1f570 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
1f580 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70     ** open savep
1f590 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65  oints. If the se
1f5a0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1f5b0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
1f5c0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
1f5d0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
1f5e0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1f5f0 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
1f600 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
1f610 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f620 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt nSavepoint = 
1f630 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
1f640 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  t;.      rc = sq
1f650 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
1f660 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1f670 67 65 72 2c 20 6e 53 61 76 65 70 6f 69 6e 74 29  ger, nSavepoint)
1f680 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1f690 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 53 61  SQLITE_OK && nSa
1f6a0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20  vepoint ){.     
1f6b0 20 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72     rc = btreePtr
1f6c0 6d 61 70 42 65 67 69 6e 28 70 42 74 2c 20 6e 53  mapBegin(pBt, nS
1f6d0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
1f6e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1f6f0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1f700 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1f710 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1f720 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1f730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f740 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
1f750 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
1f760 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
1f770 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
1f780 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
1f790 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
1f7a0 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
1f7b0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1f7c0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
1f7d0 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
1f7e0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
1f7f0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1f800 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
1f810 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
1f820 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
1f830 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
1f840 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f860 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
1f870 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
1f880 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1f890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f8a0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
1f8b0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
1f8c0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1f8f0 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
1f900 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1f910 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  Bt;.  Pgno pgno 
1f920 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
1f930 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f940 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1f950 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1f960 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d  );.  rc = pPage-
1f970 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45  >isInit ? SQLITE
1f980 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50  _OK : btreeInitP
1f990 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
1f9a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f9b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1f9c0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1f9d0 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
1f9e0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1f9f0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1fa00 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1fa10 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
1fa20 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
1fa30 20 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26   pPage, pCell, &
1fa40 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
1fa50 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1fa60 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1fa70 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
1fa80 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
1fa90 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1faa0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1fab0 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1fac0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1fad0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1fae0 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
1faf0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1fb00 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1fb10 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1fb20 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
1fb30 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1fb40 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1fb50 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
1fb60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fb70 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
1fb80 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
1fb90 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
1fba0 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
1fbb0 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
1fbc0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1fbd0 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
1fbe0 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
1fbf0 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
1fc00 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
1fc10 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
1fc20 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
1fc30 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
1fc40 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1fc50 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1fc60 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
1fc70 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
1fc80 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
1fc90 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1fca0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
1fcb0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1fcc0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1fcd0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
1fce0 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1fd00 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1fd10 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
1fd20 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
1fd30 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1fd40 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
1fd50 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
1fd60 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1fd70 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd90 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
1fda0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
1fdb0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
1fdc0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
1fdd0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
1fde0 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
1fdf0 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
1fe00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1fe10 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1fe20 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1fe30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1fe40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1fe50 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
1fe60 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
1fe70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1fe80 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
1fe90 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
1fea0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
1feb0 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
1fec0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
1fed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
1fee0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1fef0 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
1ff00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ff10 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
1ff20 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
1ff30 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1ff40 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1ff50 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
1ff60 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1ff70 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1ff80 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49   rc = pPage->isI
1ff90 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  nit ? SQLITE_OK 
1ffa0 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  : btreeInitPage(
1ffb0 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
1ffc0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ffd0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
1ffe0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
1fff0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
20000 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
20010 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
20020 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
20030 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
20040 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
20050 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
20060 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
20070 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
20080 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
20090 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
200a0 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
200b0 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
200c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
200d0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
200e0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
200f0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
20100 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
20110 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20120 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
20130 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
20140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
20150 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
20160 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  te(pCell+info.nS
20170 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20  ize-4) ){.      
20180 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
20190 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell+info.nSize-
201a0 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  4, iTo);.       
201b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
201c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
201d0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
201e0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
201f0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
20200 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
20210 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
20220 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
20230 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
20240 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20250 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
20260 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
20270 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
20280 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
20290 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
202a0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
202b0 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
202c0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
202d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
202e0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
202f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20300 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
20310 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
20320 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
20330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
20340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20350 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
20360 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
20370 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
20380 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
20390 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
203a0 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
203b0 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
203c0 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
203d0 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
203e0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
203f0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
20400 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
20410 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
20420 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
20430 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
20440 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
20450 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
20460 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
20470 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
20480 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
20490 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
204a0 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
204b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
204c0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
204d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
204e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
204f0 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
20500 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
20510 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
20520 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
20530 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
20540 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
20550 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
20560 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
20570 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
20580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
20590 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
205a0 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
205b0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
205c0 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
205d0 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
205e0 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
205f0 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
20600 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
20610 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
20620 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
20630 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
20640 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
20650 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
20660 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
20670 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
20680 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
20690 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
206a0 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
206b0 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
206c0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
206d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
206e0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
206f0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
20700 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
20710 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
20720 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
20730 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
20740 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
20750 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
20760 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
20770 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
20780 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
20790 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
207a0 20 20 69 66 28 20 69 44 62 50 61 67 65 3c 33 20    if( iDbPage<3 
207b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
207c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
207d0 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
207e0 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
207f0 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
20800 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
20810 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
20820 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
20830 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
20840 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
20850 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
20860 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
20870 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
20880 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
20890 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
208a0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
208b0 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
208c0 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
208d0 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
208e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
208f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
20900 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
20910 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
20920 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
20930 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
20940 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
20950 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
20960 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
20970 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
20980 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
20990 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
209a0 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
209b0 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
209c0 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
209d0 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
209e0 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
209f0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
20a00 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
20a10 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
20a20 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
20a30 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
20a40 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
20a50 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
20a60 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
20a70 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
20a80 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
20a90 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
20aa0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
20ab0 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
20ac0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
20ad0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
20ae0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
20af0 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
20b00 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
20b10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
20b20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20b30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
20b40 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
20b50 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
20b60 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
20b70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
20b80 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
20b90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  !=0 ){.      ptr
20ba0 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
20bb0 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
20bc0 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
20bd0 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  e, &rc);.      i
20be0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
20c00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
20c10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
20c20 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
20c30 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
20c40 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
20c50 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
20c60 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
20c70 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
20c80 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
20c90 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
20ca0 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
20cb0 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
20cc0 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
20cd0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
20ce0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
20cf0 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
20d00 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
20d10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20d30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20d40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20d50 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
20d60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
20d70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20d80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20d90 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
20da0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
20db0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
20dc0 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
20dd0 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
20de0 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
20df0 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
20e00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
20e10 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
20e20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20e30 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
20e40 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
20e50 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
20e60 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  e, &rc);.    }. 
20e70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20e80 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
20e90 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
20ea0 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
20eb0 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
20ec0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
20ed0 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
20ee0 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
20ef0 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
20f00 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
20f10 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
20f20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
20f30 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
20f40 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
20f50 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ** SQLITE_OK. If
20f60 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
20f70 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
20f80 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20  refore no point 
20f90 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  in .** calling t
20fa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
20fb0 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
20fc0 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20  TE_DONE. Or, if 
20fd0 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
20fe0 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65  urs, return some
20ff0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
21000 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  e..**.** More sp
21010 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73  ecifically, this
21020 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
21030 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
21040 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
21050 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c  o .** that the l
21060 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
21070 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
21080 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67  n use is no long
21090 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
210a0 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20   Parameter nFin 
210b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
210c0 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73   pages that this
210d0 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20   database would 
210e0 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20  contain.** were 
210f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
21100 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65  lled until it re
21110 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
21120 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
21130 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65  bCommit paramete
21140 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
21150 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
21160 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a  umes that the .*
21170 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  * caller will ke
21180 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
21190 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
211a0 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
211b0 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20  ITE_DONE .** or 
211c0 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69  an error. bCommi
211d0 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65  t is passed true
211e0 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
211f0 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a  uum-on-commit .*
21200 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
21210 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
21220 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
21230 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
21240 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
21250 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
21260 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
21270 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
21280 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
21290 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
212a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
212b0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
212c0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
212d0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
212e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
212f0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
21300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
21310 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
21320 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
21330 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
21340 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
21350 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
21360 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
21370 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
21380 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
21390 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
213a0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
213b0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
213c0 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
213d0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
213e0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
213f0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
21400 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
21410 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
21420 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
21430 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21440 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21450 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
21460 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
21470 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
21480 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21490 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
214a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
214b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
214c0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
214d0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
214e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
214f0 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
21500 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
21510 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
21520 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
21530 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
21540 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
21550 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
21560 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
21570 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
21580 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
21590 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
215a0 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
215b0 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
215c0 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
215d0 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
215e0 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
215f0 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
21600 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
21610 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
21620 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
21630 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
21640 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
21650 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
21660 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
21670 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
21680 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
21690 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
216a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
216b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
216c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
216d0 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
216e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
216f0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
21700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
21710 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
21720 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
21730 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
21740 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
21750 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
21760 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
21770 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
21780 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
21790 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
217a0 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
217b0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
217c0 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
217d0 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
217e0 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
217f0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
21800 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
21810 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
21820 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
21830 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
21840 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
21850 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21860 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
21870 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
21880 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
21890 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
218a0 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
218b0 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
218c0 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
218d0 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
218e0 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
218f0 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
21900 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
21910 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
21920 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
21930 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
21940 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
21950 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
21960 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
21970 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
21980 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
21990 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
219a0 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
219b0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
219c0 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
219d0 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
219e0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
219f0 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
21a00 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
21a10 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
21a20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
21a30 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
21a40 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
21a50 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
21a60 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
21a70 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
21a80 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
21a90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
21aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21ab0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
21ac0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
21ad0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
21ae0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21af0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21b00 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
21b10 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
21b20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
21b30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21b40 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
21b50 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
21b60 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
21b70 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
21b80 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
21b90 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d  , iFreePg, bComm
21ba0 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  it);.      relea
21bb0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
21bc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
21bd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21be0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21bf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21c00 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
21c10 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
21c20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
21c30 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
21c40 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
21c50 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
21c60 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
21c70 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
21c80 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
21c90 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
21ca0 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
21cb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
21cc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21cd0 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
21ce0 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
21cf0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
21d00 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
21d10 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
21d20 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
21d30 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
21d40 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
21d50 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
21d60 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
21d70 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
21d80 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
21d90 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
21da0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
21db0 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
21dc0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
21dd0 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
21de0 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
21df0 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
21e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21e10 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
21e20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
21e30 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
21e40 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
21e50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21e60 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
21e70 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
21e80 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ea0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
21eb0 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
21ec0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
21ed0 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
21ee0 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
21ef0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
21f00 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
21f10 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
21f20 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
21f30 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
21f40 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
21f50 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
21f60 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
21f70 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
21f80 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
21f90 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
21fa0 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
21fb0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
21fc0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
21fd0 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
21fe0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
21ff0 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
22000 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
22010 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
22020 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
22030 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
22040 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
22050 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
22060 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
22070 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
22080 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
22090 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
220a0 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
220b0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
220c0 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
220d0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
220e0 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
220f0 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
22100 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
22110 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
22120 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
22130 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
22140 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
22150 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22160 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
22170 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
22180 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
22190 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
221a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
221b0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
221c0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
221d0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
221e0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
221f0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
22200 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
22210 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
22220 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
22230 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
22240 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
22250 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
22260 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
22270 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
22280 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
22290 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
222a0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
222b0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
222c0 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
222d0 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
222e0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
222f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
22300 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
22310 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
22320 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
22330 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
22340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22350 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
22360 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
22370 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20  ache(pBt);.     
22380 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
22390 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
223a0 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20  , nOrig, 0);.   
223b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
223c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
223d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
223e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
223f0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
22400 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
22410 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
22420 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
22430 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
22440 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
22450 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22460 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
22470 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
22480 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
22490 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
224a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
224b0 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
224c0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
224d0 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
224e0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
224f0 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  itted for an aut
22500 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
22510 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
22520 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
22530 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
22540 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
22550 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
22560 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
22570 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
22580 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
22590 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
225a0 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
225b0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
225c0 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
225d0 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
225e0 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
225f0 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
22600 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
22610 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
22620 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
22630 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
22640 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
22650 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
22660 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
22670 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
22680 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
22690 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29  count(pPager); )
226a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
226b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
226c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
226d0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
226e0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
226f0 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
22700 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
22710 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
22720 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
22730 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
22740 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
22750 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
22760 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
22770 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
22780 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
22790 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
227a0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
227b0 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
227c0 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
227d0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
227e0 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
227f0 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
22800 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
22810 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
22820 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
22830 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
22840 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
22850 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
22860 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
22870 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
22880 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
22890 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
228a0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
228b0 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
228c0 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
228d0 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
228e0 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
228f0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
22900 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
22910 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
22920 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
22930 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
22940 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
22950 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
22960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22970 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22980 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
22990 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
229a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
229b0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69  ta[36]);.    nFi
229c0 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
229d0 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
229e0 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  e);.    if( nFin
229f0 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
22a00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22a10 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  KPT;.    if( nFi
22a20 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  n<nOrig ){.     
22a30 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
22a40 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
22a50 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
22a60 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
22a70 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
22a80 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
22a90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
22aa0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
22ab0 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31  , nFin, iFree, 1
22ac0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22ad0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
22ae0 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
22af0 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
22b00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22b10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22b20 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
22b30 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
22b40 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
22b50 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
22b60 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
22b70 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
22b80 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
22b90 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
22ba0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
22bb0 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
22bc0 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
22bd0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
22be0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
22bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22c00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
22c20 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
22c30 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
22c40 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d    assert( nRef>=
22c50 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
22c60 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
22c70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22c80 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
22c90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
22ca0 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
22cb0 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
22cc0 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
22cd0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
22ce0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
22cf0 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69  URRENT./*.** Thi
22d00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22d10 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
22d20 6d 65 72 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55  merging an CONCU
22d30 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
22d40 6e 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e  n with.** the sn
22d50 61 70 73 68 6f 74 20 61 74 20 74 68 65 20 68 65  apshot at the he
22d60 61 64 20 6f 66 20 74 68 65 20 77 61 6c 20 66 69  ad of the wal fi
22d70 6c 65 2e 20 49 74 20 72 65 6c 6f 63 61 74 65 73  le. It relocates
22d80 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
22d90 65 0a 2a 2a 20 72 61 6e 67 65 20 69 46 69 72 73  e.** range iFirs
22da0 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73  t..iLast, inclus
22db0 69 76 65 2e 20 49 74 20 69 73 20 61 73 73 75 6d  ive. It is assum
22dc0 65 64 20 74 68 61 74 20 74 68 65 20 42 74 72 65  ed that the Btre
22dd0 65 50 74 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75  ePtrmap .** stru
22de0 63 74 75 72 65 20 61 74 20 42 74 53 68 61 72 65  cture at BtShare
22df0 64 2e 70 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20  d.pMap contains 
22e00 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
22e10 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  the pointers to 
22e20 65 61 63 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20  each.** page in 
22e30 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a  the range..**.**
22e40 20 49 66 20 70 6e 43 75 72 72 65 6e 74 20 69 73   If pnCurrent is
22e50 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20   NULL, then all 
22e60 70 61 67 65 73 20 69 6e 20 74 68 65 20 72 61 6e  pages in the ran
22e70 67 65 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ge are moved to 
22e80 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65  currently.** fre
22e90 65 20 6c 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65  e locations (i.e
22ea0 2e 20 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72  . free-list entr
22eb0 69 65 73 29 20 77 69 74 68 69 6e 20 74 68 65 20  ies) within the 
22ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
22ed0 66 6f 72 65 20 70 61 67 65 0a 2a 2a 20 69 46 69  fore page.** iFi
22ee0 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  rst..**.** Or, i
22ef0 66 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 6e  f pnCurrent is n
22f00 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
22f10 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
22f20 75 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ue containing th
22f30 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 69 7a  e.** current siz
22f40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
22f50 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
22f60 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
22f70 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
22f80 72 65 6c 6f 63 61 74 65 64 20 74 6f 20 74 68 65  relocated to the
22f90 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
22fa0 62 61 73 65 20 66 69 6c 65 20 2d 20 70 61 67 65  base file - page
22fb0 20 69 46 69 72 73 74 20 69 73 20 72 65 6c 6f 63   iFirst is reloc
22fc0 61 74 65 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20  ated to.** page 
22fd0 28 2a 70 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20  (*pnCurrent+1), 
22fe0 70 61 67 65 20 69 46 69 72 73 74 2b 31 20 74 6f  page iFirst+1 to
22ff0 20 70 61 67 65 20 28 2a 70 6e 43 75 72 72 65 6e   page (*pnCurren
23000 74 2b 32 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e  t+2), and so on.
23010 0a 2a 2a 20 56 61 6c 75 65 20 2a 70 6e 43 75 72  .** Value *pnCur
23020 72 65 6e 74 20 69 73 20 73 65 74 20 74 6f 20 74  rent is set to t
23030 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74  he new size of t
23040 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
23050 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
23060 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
23070 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  .** If no error 
23080 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
23090 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
230a0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
230b0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
230c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
230d0 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65  reeRelocateRange
230e0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
230f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
23100 20 20 20 20 2f 2a 20 42 2d 74 72 65 65 20 68 61      /* B-tree ha
23110 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ndle */.  Pgno i
23120 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
23130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23140 73 74 20 70 61 67 65 20 74 6f 20 72 65 6c 6f 63  st page to reloc
23150 61 74 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c  ate */.  Pgno iL
23160 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
23170 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
23180 20 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74   page to relocat
23190 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43  e */.  Pgno *pnC
231a0 75 72 72 65 6e 74 20 20 20 20 20 20 20 20 20 20  urrent          
231b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
231c0 20 4e 55 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44   NULL, IN/OUT: D
231d0 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
231e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
231f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
23200 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
23210 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f  Bt->pMap;.  Pgno
23220 20 69 50 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67   iPg;..  for(iPg
23230 3d 69 46 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c  =iFirst; iPg<=iL
23240 61 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ast && rc==SQLIT
23250 45 5f 4f 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  E_OK; iPg++){.  
23260 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
23270 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 61 67   = 0;     /* Pag
23280 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d  e allocated from
23290 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20   free-list */.  
232a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
232b0 20 30 3b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   0;.    Pgno iNe
232c0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
232d0 2f 2a 20 4e 65 77 20 70 61 67 65 20 6e 75 6d 62  /* New page numb
232e0 65 72 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20  er for pPg */.  
232f0 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70    PtrmapEntry *p
23300 45 6e 74 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69  Entry;    /* Poi
23310 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
23320 6f 72 20 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a  or page iPg */..
23330 20 20 20 20 69 66 28 20 69 50 67 3d 3d 50 45 4e      if( iPg==PEN
23340 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
23350 42 74 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Bt) ) continue;.
23360 20 20 20 20 70 45 6e 74 72 79 20 3d 20 26 70 4d      pEntry = &pM
23370 61 70 2d 3e 61 50 74 72 5b 69 50 67 20 2d 20 70  ap->aPtr[iPg - p
23380 4d 61 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20  Map->iFirst];.. 
23390 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 65     if( pEntry->e
233a0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
233b0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 50  EPAGE ){.      P
233c0 67 6e 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  gno dummy;.     
233d0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
233e0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
233f0 72 65 65 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67  ree, &dummy, iPg
23400 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
23410 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
23420 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
23430 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
23440 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 46  rPageRefcount(pF
23450 72 65 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 31  ree->pDbPage)==1
23460 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
23470 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 46  te3PcacheDrop(pF
23480 72 65 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ree->pDbPage);. 
23490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
234a0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
234b0 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50 67  OK || dummy==iPg
234c0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
234d0 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b 0a 20  ( pnCurrent ){. 
234e0 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61 67       btreeGetPag
234f0 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67  e(pBt, iPg, &pPg
23500 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
23510 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
23520 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 67 2d  Iswriteable(pPg-
23530 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
23540 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23550 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
23560 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61 67 65  unt(pPg->pDbPage
23570 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 4e  )==1 );.      iN
23580 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
23590 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  nt);.      if( i
235a0 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  New==PENDING_BYT
235b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 69 4e  E_PAGE(pBt) ) iN
235c0 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
235d0 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
235e0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
235f0 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65  , pPg, pEntry->e
23600 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61  Type, pEntry->pa
23610 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a  rent, iNew, 1);.
23620 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
23630 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  eNotNull(pPg);. 
23640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23650 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
23660 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
23670 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69 72 73  ee, &iNew, iFirs
23680 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45 29  t-1, BTALLOC_LE)
23690 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
236a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
236b0 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29 3b 0a   iNew<iFirst );.
236c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
236d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
236e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
236f0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Free);.        b
23700 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
23710 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a   iPg, &pPg, 0);.
23720 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
23730 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
23740 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  Pg, pEntry->eTyp
23750 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e  e, pEntry->paren
23760 74 2c 69 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20  t,iNew,1);.     
23770 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
23780 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
23790 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
237a0 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e  rc;.}../* !defin
237b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
237c0 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a  ONCURRENT).**.**
237d0 20 54 68 65 20 62 2d 74 72 65 65 20 68 61 6e 64   The b-tree hand
237e0 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
237f0 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69   only argument i
23800 73 20 61 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69  s about to commi
23810 74 20 61 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52 45  t an.** CONCURRE
23820 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  NT transaction. 
23830 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
23840 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
23850 68 61 74 20 74 68 69 73 20 69 73 20 0a 2a 2a 20  hat this is .** 
23860 70 6f 73 73 69 62 6c 65 20 2d 20 74 68 65 20 77  possible - the w
23870 61 6c 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 69  al WRITER lock i
23880 73 20 68 65 6c 64 20 61 6e 64 20 69 74 20 69 73  s held and it is
23890 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 72   known that ther
238a0 65 20 61 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e  e are .** no con
238b0 66 6c 69 63 74 73 20 77 69 74 68 20 63 6f 6d 6d  flicts with comm
238c0 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
238d0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
238e0 74 20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b  t btreeFixUnlock
238f0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
23900 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23910 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
23920 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
23930 3e 70 50 61 67 65 31 3b 0a 20 20 75 38 20 2a 70  >pPage1;.  u8 *p
23940 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
23950 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
23960 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
23970 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23980 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
23990 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
239a0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 77  atabase is not w
239b0 72 69 74 61 62 6c 65 2c 20 74 68 65 6e 20 6e 6f  ritable, then no
239c0 20 70 61 67 65 73 20 77 65 72 65 20 61 6c 6c 6f   pages were allo
239d0 63 61 74 65 64 0a 20 20 2a 2a 20 6f 72 20 66 72  cated.  ** or fr
239e0 65 65 64 20 62 79 20 74 68 69 73 20 74 72 61 6e  eed by this tran
239f0 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
23a00 20 63 61 73 65 20 6e 6f 20 73 70 65 63 69 61 6c   case no special
23a10 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 0a 20 20   handling is .  
23a20 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  ** required. Oth
23a30 65 72 77 69 73 65 2c 20 69 66 20 70 61 67 65 20  erwise, if page 
23a40 31 20 69 73 20 64 69 72 74 79 2c 20 70 72 6f 63  1 is dirty, proc
23a50 65 65 64 2e 20 20 2a 2f 0a 20 20 42 74 72 65 65  eed.  */.  Btree
23a60 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
23a70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f  Bt->pMap;.  Pgno
23a80 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
23a90 74 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20 50  te(&p1[32]);.  P
23aa0 67 6e 6f 20 6e 50 61 67 65 20 3d 20 62 74 72 65  gno nPage = btre
23ab0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
23ac0 0a 20 20 75 33 32 20 6e 46 72 65 65 20 3d 20 67  .  u32 nFree = g
23ad0 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29  et4byte(&p1[36])
23ae0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
23af0 2d 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d  ->pMap );.  rc =
23b00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 70 67   sqlite3PagerUpg
23b10 72 61 64 65 53 6e 61 70 73 68 6f 74 28 70 50 61  radeSnapshot(pPa
23b20 67 65 72 2c 20 70 50 61 67 65 31 2d 3e 70 44 62  ger, pPage1->pDb
23b30 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
23b40 20 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61   p1==pPage1->aDa
23b50 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ta );..  if( rc=
23b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23b70 20 20 50 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20    Pgno nHPage = 
23b80 67 65 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d  get4byte(&p1[28]
23b90 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
23ba0 20 3d 20 6e 48 50 61 67 65 3b 20 20 20 20 20 20   = nHPage;      
23bb0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
23bc0 20 61 66 74 65 72 20 74 72 61 6e 73 61 63 74 69   after transacti
23bd0 6f 6e 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20  on merge */..   
23be0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
23bf0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
23c00 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 7b  ge1->pDbPage) ){
23c10 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 48 54 72  .      Pgno iHTr
23c20 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
23c30 70 31 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 75  p1[32]);.      u
23c40 33 32 20 6e 48 46 72 65 65 20 3d 20 67 65 74 34  32 nHFree = get4
23c50 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a  byte(&p1[36]);..
23c60 20 20 20 20 20 20 62 74 72 65 65 50 74 72 6d 61        btreePtrma
23c70 70 43 68 65 63 6b 28 70 42 74 2c 20 6e 50 61 67  pCheck(pBt, nPag
23c80 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74  e);..      /* At
23c90 74 61 63 68 20 74 68 65 20 68 65 61 64 20 64 61  tach the head da
23ca0 74 61 62 61 73 65 20 66 72 65 65 20 6c 69 73 74  tabase free list
23cb0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
23cc0 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20  he current.     
23cd0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
23ce0 20 66 72 65 65 2d 6c 69 73 74 20 28 69 66 20 61   free-list (if a
23cf0 6e 79 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ny).  */.      i
23d00 66 28 20 69 54 72 75 6e 6b 21 3d 30 20 29 7b 0a  f( iTrunk!=0 ){.
23d10 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
23d20 28 26 70 31 5b 33 36 5d 2c 20 6e 48 46 72 65 65  (&p1[36], nHFree
23d30 20 2b 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 20   + nFree);.     
23d40 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b     put4byte(&p1[
23d50 33 32 5d 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  32], iTrunk);.  
23d60 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 54 72        while( iTr
23d70 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
23d80 20 44 62 50 61 67 65 20 2a 70 54 72 75 6e 6b 20   DbPage *pTrunk 
23d90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
23da0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 54 72  okup(pPager, iTr
23db0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
23dc0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
23dd0 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70  e((u8*)pTrunk->p
23de0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  Data);.         
23df0 20 69 66 28 20 69 54 72 75 6e 6b 3d 3d 30 20 29   if( iTrunk==0 )
23e00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
23e10 74 34 62 79 74 65 28 28 75 38 2a 29 70 54 72 75  t4byte((u8*)pTru
23e20 6e 6b 2d 3e 70 44 61 74 61 2c 20 69 48 54 72 75  nk->pData, iHTru
23e30 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
23e40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23e50 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 72  e3PagerUnref(pTr
23e60 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 3b  unk);.        };
23e70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23e80 69 66 28 20 6e 48 50 61 67 65 3c 28 70 4d 61 70  if( nHPage<(pMap
23e90 2d 3e 69 46 69 72 73 74 2d 31 29 20 29 7b 0a 20  ->iFirst-1) ){. 
23ea0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
23eb0 74 61 62 61 73 65 20 63 6f 6e 73 69 73 74 65 64  tabase consisted
23ec0 20 6f 66 20 28 70 4d 61 70 2d 3e 69 46 69 72 73   of (pMap->iFirs
23ed0 74 2d 31 29 20 70 61 67 65 73 20 77 68 65 6e 20  t-1) pages when 
23ee0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
23ef0 20 20 20 20 2a 2a 20 63 6f 6e 63 75 72 72 65 6e      ** concurren
23f00 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
23f10 73 20 6f 70 65 6e 65 64 2e 20 41 6e 64 20 61 6e  s opened. And an
23f20 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
23f30 73 61 63 74 69 6f 6e 20 6d 61 79 0a 20 20 20 20  saction may.    
23f40 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 65 78      ** not be ex
23f50 65 63 75 74 65 64 20 6f 6e 20 61 6e 20 61 75 74  ecuted on an aut
23f60 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
23f70 65 20 2d 20 73 6f 20 74 68 65 20 64 62 20 73 68  e - so the db sh
23f80 6f 75 6c 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  ould .        **
23f90 20 6e 6f 74 20 68 61 76 65 20 73 68 72 75 6e 6b   not have shrunk
23fa0 20 73 69 6e 63 65 20 74 68 65 20 74 72 61 6e 73   since the trans
23fb0 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
23fc0 64 2e 20 54 68 65 72 65 66 6f 72 65 20 6e 48 50  d. Therefore nHP
23fd0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  age.        ** s
23fe0 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  hould be set to 
23ff0 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29  (pMap->iFirst-1)
24000 20 6f 72 20 67 72 65 61 74 65 72 2e 20 2a 2f 0a   or greater. */.
24010 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24020 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
24030 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24040 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
24050 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
24060 6e 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  n allocated page
24070 73 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 74  s pMap->iFirst t
24080 68 72 6f 75 67 68 0a 20 20 20 20 20 20 20 20 2a  hrough.        *
24090 2a 20 6e 50 61 67 65 20 28 69 6e 63 6c 75 73 69  * nPage (inclusi
240a0 76 65 29 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ve) at the end o
240b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
240c0 69 6c 65 2e 20 4d 65 61 6e 77 68 69 6c 65 2c 0a  ile. Meanwhile,.
240d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
240e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 68 61   transactions ha
240f0 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 46  ve allocated (iF
24100 69 72 73 74 2e 2e 6e 48 50 61 67 65 29 2e 20 53  irst..nHPage). S
24110 6f 20 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a  o move.        *
24120 2a 20 70 61 67 65 73 20 28 69 46 69 72 73 74 2e  * pages (iFirst.
24130 2e 4d 49 4e 28 6e 50 61 67 65 2c 6e 48 50 61 67  .MIN(nPage,nHPag
24140 65 29 29 20 74 6f 20 28 4d 41 58 28 6e 50 61 67  e)) to (MAX(nPag
24150 65 2c 6e 48 50 61 67 65 29 2b 31 29 2e 20 2a 2f  e,nHPage)+1). */
24160 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4c  .        Pgno iL
24170 61 73 74 20 3d 20 4d 49 4e 28 6e 50 61 67 65 2c  ast = MIN(nPage,
24180 20 6e 48 50 61 67 65 29 3b 20 20 20 20 2f 2a 20   nHPage);    /* 
24190 4c 61 73 74 20 70 61 67 65 20 74 6f 20 6d 6f 76  Last page to mov
241a0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e  e */.        Pgn
241b0 6f 20 6e 43 75 72 72 65 6e 74 3b 20 20 20 20 20  o nCurrent;     
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
241e0 20 6f 66 20 64 62 20 2a 2f 0a 0a 20 20 20 20 20   of db */..     
241f0 20 20 20 6e 43 75 72 72 65 6e 74 20 3d 20 4d 41     nCurrent = MA
24200 58 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65 29  X(nPage, nHPage)
24210 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  ;.        pBt->n
24220 50 61 67 65 20 3d 20 6e 43 75 72 72 65 6e 74 3b  Page = nCurrent;
24230 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
24240 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65  reeRelocateRange
24250 28 70 42 74 2c 20 70 4d 61 70 2d 3e 69 46 69 72  (pBt, pMap->iFir
24260 73 74 2c 20 69 4c 61 73 74 2c 20 26 6e 43 75 72  st, iLast, &nCur
24270 72 65 6e 74 29 3b 0a 0a 20 20 20 20 20 20 20 20  rent);..        
24280 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 77  /* There are now
24290 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77   no collisions w
242a0 69 74 68 20 74 68 65 20 73 6e 61 70 73 68 6f 74  ith the snapshot
242b0 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 20   at the head of 
242c0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
242d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
242e0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
242f0 74 20 77 6f 75 6c 64 20 62 65 20 70 6f 73 73 69  t would be possi
24300 62 6c 65 20 74 6f 20 77 72 69 74 65 0a 20 20 20  ble to write.   
24310 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e       ** the tran
24320 73 61 63 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  saction out to d
24330 69 73 6b 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  isk. Before doin
24340 67 20 73 6f 20 74 68 6f 75 67 68 2c 20 61 74 74  g so though, att
24350 65 6d 70 74 20 74 6f 0a 20 20 20 20 20 20 20 20  empt to.        
24360 2a 2a 20 72 65 6c 6f 63 61 74 65 20 73 6f 6d 65  ** relocate some
24370 20 6f 66 20 74 68 65 20 6e 65 77 20 70 61 67 65   of the new page
24380 73 20 74 6f 20 66 72 65 65 20 6c 6f 63 61 74 69  s to free locati
24390 6f 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20 62  ons within the b
243a0 6f 64 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ody.        ** o
243b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
243c0 69 6c 65 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c  ile (i.e. free-l
243d0 69 73 74 20 65 6e 74 72 69 65 73 29 2e 20 2a 2f  ist entries). */
243e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
243f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24400 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24410 6e 43 75 72 72 65 6e 74 21 3d 50 45 4e 44 49 4e  nCurrent!=PENDIN
24420 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
24430 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
24440 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 62 73  lite3PagerSetDbs
24450 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
24460 20 6e 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20   nCurrent);.    
24470 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65        nFree = ge
24480 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b  t4byte(&p1[36]);
24490 0a 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 20  .          nFin 
244a0 3d 20 6e 43 75 72 72 65 6e 74 2d 6e 46 72 65 65  = nCurrent-nFree
244b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
244c0 6e 43 75 72 72 65 6e 74 3e 50 45 4e 44 49 4e 47  nCurrent>PENDING
244d0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
244e0 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47  && nFin<=PENDING
244f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
24500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
24510 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Fin--;.         
24520 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e 46 69   }.          nFi
24530 6e 20 3d 20 4d 41 58 28 6e 46 69 6e 2c 20 6e 48  n = MAX(nFin, nH
24540 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24550 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f 63   rc = btreeReloc
24560 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20 6e 46  ateRange(pBt, nF
24570 69 6e 2b 31 2c 20 6e 43 75 72 72 65 6e 74 2c 20  in+1, nCurrent, 
24580 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  0);.        }.. 
24590 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
245a0 26 70 31 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  &p1[28], nFin);.
245b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
245c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
245d0 74 44 62 73 69 7a 65 28 70 50 61 67 65 72 2c 20  tDbsize(pPager, 
245e0 6e 46 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  nFin);.  }..  re
245f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
24600 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 46  .# define btreeF
24610 69 78 55 6e 6c 6f 63 6b 65 64 28 58 29 20 20 53  ixUnlocked(X)  S
24620 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20  QLITE_OK.#endif 
24630 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
24640 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a  ONCURRENT */../*
24650 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24660 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
24670 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
24680 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
24690 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
246a0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
246b0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
246c0 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
246d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
246e0 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
246f0 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
24700 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
24710 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
24720 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
24730 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
24740 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
24750 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
24760 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
24770 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
24780 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
24790 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
247a0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
247b0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
247c0 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
247d0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
247e0 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
247f0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
24800 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
24810 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
24820 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
24830 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
24840 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
24850 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
24860 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
24870 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
24880 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
24890 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
248a0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
248b0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
248c0 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
248d0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
248e0 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
248f0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
24900 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
24910 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
24920 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
24930 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
24940 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
24950 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
24960 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
24970 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
24980 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
24990 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
249a0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
249b0 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
249c0 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
249d0 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
249e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
249f0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
24a00 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
24a10 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
24a20 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
24a30 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
24a40 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
24a50 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
24a60 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
24a70 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
24a80 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
24a90 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
24aa0 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
24ab0 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
24ac0 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
24ad0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
24ae0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
24af0 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
24b00 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
24b10 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
24b20 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
24b30 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
24b40 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
24b50 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
24b60 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
24b70 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
24b80 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
24b90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
24ba0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24bb0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
24bc0 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
24bd0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
24be0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24bf0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
24c00 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
24c10 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
24c20 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
24c30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
24c40 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 23 69 66  eeEnter(p);..#if
24c50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24c60 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
24c70 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
24c80 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 61 73 73  uum ){.      ass
24c90 65 72 74 28 20 49 53 43 4f 4e 43 55 52 52 45 4e  ert( ISCONCURREN
24ca0 54 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  T==0 );.      rc
24cb0 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
24cc0 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
24cd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24ce0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
24cf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
24d00 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
24d10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
24d20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
24d30 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
24d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24d50 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
24d60 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
24d70 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
24d80 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
24d90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24da0 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 7b 0a  ISCONCURRENT ){.
24db0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
24dc0 46 69 78 55 6e 6c 6f 63 6b 65 64 28 70 29 3b 0a  FixUnlocked(p);.
24dd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
24de0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24df0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24e00 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
24e10 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
24e20 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
24e30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24e40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
24e50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24e60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24e70 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24e80 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
24e90 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
24ea0 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
24eb0 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
24ec0 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
24ed0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
24ee0 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
24ef0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
24f00 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
24f10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24f20 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
24f30 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
24f40 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
24f50 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
24f60 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
24f70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
24f80 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
24f90 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
24fa0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
24fb0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
24fc0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
24fd0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
24fe0 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
24ff0 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
25000 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
25010 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
25020 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
25030 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
25040 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
25050 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
25060 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
25070 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
25080 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
25090 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
250a0 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
250b0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
250c0 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
250d0 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
250e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
250f0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
25100 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
25110 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
25120 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
25130 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
25140 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
25150 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
25160 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
25170 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
25180 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
25190 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
251a0 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
251b0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
251c0 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
251d0 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
251e0 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
251f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
25200 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
25210 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
25220 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
25230 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
25240 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
25250 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
25260 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
25270 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
25280 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
25290 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
252a0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
252b0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
252c0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
252d0 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
252e0 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
252f0 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
25300 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
25310 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
25320 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
25330 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
25340 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
25350 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
25360 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
25370 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
25380 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
25390 77 61 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e  was an CONCURREN
253a0 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  T transaction, d
253b0 65 6c 65 74 65 20 74 68 65 20 70 42 74 2d 3e 70  elete the pBt->p
253c0 4d 61 70 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  Map object..  **
253d0 20 41 6c 73 6f 20 63 61 6c 6c 20 50 61 67 65 72   Also call Pager
253e0 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 29 20  EndConcurrent() 
253f0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
25400 68 65 20 70 61 67 65 72 20 68 61 73 20 64 69 73  he pager has dis
25410 63 61 72 64 65 64 0a 20 20 2a 2a 20 74 68 65 20  carded.  ** the 
25420 72 65 63 6f 72 64 20 6f 66 20 61 6c 6c 20 70 61  record of all pa
25430 67 65 73 20 72 65 61 64 20 77 69 74 68 69 6e 20  ges read within 
25440 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
25450 20 20 2a 2f 0a 20 20 62 74 72 65 65 50 74 72 6d    */.  btreePtrm
25460 61 70 44 65 6c 65 74 65 28 70 42 74 29 3b 0a 20  apDelete(pBt);. 
25470 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e 64   sqlite3PagerEnd
25480 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d 3e  Concurrent(pBt->
25490 70 50 61 67 65 72 29 3b 0a 20 20 62 74 72 65 65  pPager);.  btree
254a0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
254b0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
254c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
254d0 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
254e0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
254f0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
25500 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
25510 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
25520 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
25530 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
25540 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
25550 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
25560 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
25570 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
25580 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
25590 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
255a0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
255b0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
255c0 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
255d0 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
255e0 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
255f0 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
25600 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
25610 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
25620 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
25630 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
25640 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
25650 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
25660 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
25670 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
25680 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
25690 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
256a0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
256b0 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
256c0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
256d0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
256e0 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
256f0 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ks..**.** Normal
25700 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
25710 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
25720 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20   pager layer is 
25730 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a  attempting to .*
25740 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75  * finalize the u
25750 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61  nderlying journa
25760 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e  l file, this fun
25770 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ction returns an
25780 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68   error and.** th
25790 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
257a0 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c  ll attempt a rol
257b0 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20  lback. However, 
257c0 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
257d0 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e  gument.** is non
257e0 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
257f0 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69  b-tree transacti
25800 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
25810 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74  multi-file .** t
25820 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74  ransaction. In t
25830 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72  his case, the tr
25840 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
25850 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69  ready been commi
25860 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c  tted .** (by del
25870 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  eting a master j
25880 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
25890 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
258a0 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a   ignore this .**
258b0 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
258c0 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e  n code. So, even
258d0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
258e0 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72  urs in the pager
258f0 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74   layer,.** reset
25900 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
25910 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  cts internal sta
25920 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  te to indicate t
25930 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a  hat the write.**
25940 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
25950 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68   been closed. Th
25960 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65  is is quite safe
25970 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77  , as the pager w
25980 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e  ill have.** tran
25990 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20  sitioned to the 
259a0 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
259b0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
259c0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
259d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
259e0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
259f0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
25a00 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
25a10 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
25a20 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
25a30 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25a40 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
25a50 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43  Btree *p, int bC
25a60 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20  leanup){..  if( 
25a70 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
25a80 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  S_NONE ) return 
25a90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
25aa0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
25ab0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
25ac0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
25ad0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
25ae0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
25af0 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
25b00 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
25b10 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
25b20 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
25b30 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
25b40 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
25b50 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
25b60 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
25b70 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
25b80 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
25b90 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
25ba0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
25bb0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
25bc0 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
25bd0 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
25be0 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
25bf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25c00 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
25c10 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
25c20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25c30 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70  E_OK && bCleanup
25c40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
25c50 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
25c60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25c70 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rc;.    }.    p-
25c80 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b  >iDataVersion--;
25c90 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20    /* Compensate 
25ca0 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74  for pPager->iDat
25cb0 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20  aVersion++; */. 
25cc0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
25cd0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
25ce0 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
25cf0 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
25d00 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
25d10 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
25d20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
25d30 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
25d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25d50 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
25d60 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
25d70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
25d80 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
25d90 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
25da0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
25db0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
25dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
25dd0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
25de0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
25df0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
25e00 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
25e10 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
25e20 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
25e30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
25e40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25e50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
25e60 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
25e70 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
25e80 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
25e90 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
25ea0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
25eb0 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68  rsor on any BtSh
25ec0 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
25ed0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20  .** references. 
25ee0 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65   Or if the write
25ef0 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74  Only flag is set
25f00 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79   to 1, then only
25f10 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63  .** trip write c
25f20 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65  ursors and leave
25f30 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e   read cursors un
25f40 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
25f50 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61  very cursor is a
25f60 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
25f70 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
25f80 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74  ing cursors.** t
25f90 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74  hat belong to ot
25fa0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
25fb0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
25fc0 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68  ppen to be.** sh
25fd0 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20  aring the cache 
25fe0 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
25ff0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26000 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
26010 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
26020 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65  rs. If the write
26030 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Only.** flag is 
26040 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  true, then only 
26050 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65  write-cursors ne
26060 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20  ed be tripped - 
26070 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72  read-only.** cur
26080 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20  sors save their 
26090 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
260a0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d  s so that they m
260b0 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20  ay continue .** 
260c0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f  following the ro
260d0 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77  llback. Or, if w
260e0 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
260f0 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  e, all cursors a
26100 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20  re .** tripped. 
26110 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74  In general, writ
26120 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69  eOnly is false i
26130 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
26140 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65  n being.** rolle
26150 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20  d back modified 
26160 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
26170 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ema. In this cas
26180 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a  e b-tree root.**
26190 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f   pages may be mo
261a0 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66  ved or deleted f
261b0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
261c0 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b   altogether, mak
261d0 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65  ing.** it unsafe
261e0 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
261f0 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  s to continue..*
26200 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74  *.** If the writ
26210 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72  eOnly flag is tr
26220 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ue and an error 
26230 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
26240 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20  hile .** saving 
26250 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
26260 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f  tion of a read-o
26270 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20  nly cursor, all 
26280 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63  cursors, .** inc
26290 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d  luding all read-
262a0 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
262b0 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ped..**.** SQLIT
262c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
262d0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
262e0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
262f0 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73  ccurs while.** s
26300 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70  aving a cursor p
26310 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69  osition, an SQLi
26320 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
26330 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
26340 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
26350 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
26360 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74  int errCode, int
26370 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42   writeOnly){.  B
26380 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e  tCursor *p;.  in
26390 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
263a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72  ;..  assert( (wr
263b0 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72  iteOnly==0 || wr
263c0 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42  iteOnly==1) && B
263d0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31  TCF_WriteFlag==1
263e0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65   );.  if( pBtree
263f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
26400 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
26410 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74  );.    for(p=pBt
26420 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
26430 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
26440 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69  ){.      if( wri
26450 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75  teOnly && (p->cu
26460 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
26470 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20  iteFlag)==0 ){. 
26480 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53         if( p->eS
26490 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
264a0 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d  ID || p->eState=
264b0 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
264c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
264d0 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
264e0 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
264f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26500 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26510 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
26520 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
26530 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63  rsors(pBtree, rc
26540 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
26550 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
26560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26570 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26580 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
26590 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
265a0 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
265b0 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
265c0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69  ;.        p->ski
265d0 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b  pNext = errCode;
265e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
265f0 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
26600 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20  rsorPages(p);.  
26610 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
26620 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
26630 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26640 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
26650 20 74 68 65 20 70 42 74 2d 3e 6e 50 61 67 65 20   the pBt->nPage 
26660 66 69 65 6c 64 20 63 6f 72 72 65 63 74 6c 79 2c  field correctly,
26670 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
26680 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 73 74 61  e current.** sta
26690 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  te of the databa
266a0 73 65 2e 20 20 41 73 73 75 6d 65 20 70 42 74 2d  se.  Assume pBt-
266b0 3e 70 50 61 67 65 31 20 69 73 20 76 61 6c 69 64  >pPage1 is valid
266c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
266d0 20 62 74 72 65 65 53 65 74 4e 50 61 67 65 28 42   btreeSetNPage(B
266e0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
266f0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 29 7b 0a  mPage *pPage1){.
26700 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
26710 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26720 61 44 61 74 61 5b 32 38 5d 29 3b 0a 20 20 74 65  aData[28]);.  te
26730 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30  stcase( nPage==0
26740 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d   );.  if( nPage=
26750 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
26760 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
26770 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
26780 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74  .  testcase( pBt
26790 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
267a0 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  ;.  pBt->nPage =
267b0 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nPage;.}../*.**
267c0 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
267d0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
267e0 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
267f0 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
26800 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
26810 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
26820 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
26830 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
26840 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
26850 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
26860 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
26870 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
26880 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
26890 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
268a0 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
268b0 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
268c0 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
268d0 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
268e0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
268f0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
26900 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
26910 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26920 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
26930 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
26940 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
26950 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
26960 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
26970 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
26980 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
26990 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
269a0 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
269b0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
269c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
269d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
269e0 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
269f0 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
26a00 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
26a10 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
26a20 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
26a30 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
26a40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
26a50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
26a60 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
26a70 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
26a80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
26a90 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
26aa0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
26ab0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
26ac0 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
26ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
26ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
26af0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
26b00 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
26b10 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
26b20 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
26b30 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
26b40 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
26b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
26b60 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
26b70 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
26b80 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
26b90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
26ba0 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
26bb0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
26bc0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
26bd0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
26be0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
26bf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
26c00 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
26c10 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
26c20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
26c30 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
26c40 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
26c50 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
26c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
26c70 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
26c80 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
26c90 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
26ca0 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
26cb0 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
26cc0 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
26cd0 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
26ce0 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
26cf0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
26d00 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
26d10 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
26d20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
26d30 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
26d40 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
26d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26d60 20 62 74 72 65 65 53 65 74 4e 50 61 67 65 28 70   btreeSetNPage(p
26d70 42 74 2c 20 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt, pPage1);.   
26d80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
26d90 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
26da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
26db0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
26dc0 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20  Bt, 1)==0 );.   
26dd0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
26de0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
26df0 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
26e00 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
26e10 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
26e20 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
26e30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
26e40 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
26e50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
26e60 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
26e70 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
26e80 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
26e90 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  on can be rolled
26ea0 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
26eb0 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
26ec0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
26ed0 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
26ee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
26ef0 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
26f00 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
26f10 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
26f20 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
26f30 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
26f40 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
26f50 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
26f60 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
26f70 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
26f80 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
26f90 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
26fa0 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
26fb0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
26fc0 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
26fd0 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
26fe0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
26ff0 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
27000 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
27010 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
27020 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
27030 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
27040 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
27050 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
27060 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
27070 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
27080 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
27090 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
270a0 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
270b0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
270c0 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
270d0 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
270e0 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
270f0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
27100 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
27110 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
27120 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
27130 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
27140 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
27150 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
27160 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
27170 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
27180 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
27190 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
271a0 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
271b0 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
271c0 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
271d0 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
271e0 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
271f0 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
27200 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
27210 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
27220 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
27230 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
27240 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
27250 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
27260 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
27270 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
27280 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
27290 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
272a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
272b0 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
272c0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
272d0 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
272e0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
272f0 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
27300 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
27310 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
27320 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
27330 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
27340 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
27350 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
27360 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
27370 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61  ;.  /* At the pa
27380 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
27390 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
273a0 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
273b0 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69  t with.  ** an i
273c0 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
273d0 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
273e0 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
273f0 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53  tly using.  ** S
27400 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
27410 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
27420 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
27430 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
27440 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
27450 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
27460 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
27470 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
27480 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72  active..  */.  r
27490 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
274a0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
274b0 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
274c0 65 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  ement);.  if( rc
274d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
274e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72     rc = btreePtr
274f0 6d 61 70 42 65 67 69 6e 28 70 42 74 2c 20 69 53  mapBegin(pBt, iS
27500 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20  tatement);.  }. 
27510 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
27520 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
27530 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
27540 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
27550 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
27560 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
27570 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
27580 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
27590 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
275a0 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
275b0 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
275c0 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
275d0 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
275e0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
275f0 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
27600 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
27610 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
27620 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
27630 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
27640 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
27650 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
27660 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
27670 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
27680 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
27690 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
276a0 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
276b0 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
276c0 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
276d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
276e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
276f0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
27700 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
27710 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
27720 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
27730 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
27740 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
27750 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
27760 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
27770 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
27780 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
27790 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
277a0 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
277b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
277c0 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
277d0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
277e0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
277f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
27800 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
27810 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
27820 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
27830 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
27840 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
27850 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
27860 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
27870 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
27880 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
27890 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
278a0 3b 0a 20 20 20 20 62 74 72 65 65 50 74 72 6d 61  ;.    btreePtrma
278b0 70 45 6e 64 28 70 42 74 2c 20 6f 70 2c 20 69 53  pEnd(pBt, op, iS
278c0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
278d0 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
278e0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
278f0 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
27900 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
27910 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
27920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27930 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
27940 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
27950 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
27960 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
27970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
27980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27990 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
279a0 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
279b0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
279c0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
279d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
279e0 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
279f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
27a00 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
27a10 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 53 65  );.      btreeSe
27a20 74 4e 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  tNPage(pBt, pBt-
27a30 3e 70 50 61 67 65 31 29 3b 0a 0a 20 20 20 20 20  >pPage1);..     
27a40 20 2f 2a 20 70 42 74 2d 3e 6e 50 61 67 65 20 6d   /* pBt->nPage m
27a50 69 67 68 74 20 62 65 20 7a 65 72 6f 20 69 66 20  ight be zero if 
27a60 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
27a70 20 63 6f 72 72 75 70 74 20 77 68 65 6e 20 0a 20   corrupt when . 
27a80 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e       ** the tran
27a90 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
27aa0 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
27ab0 69 74 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  it must be at le
27ac0 61 73 74 20 31 2e 20 20 2a 2f 0a 20 20 20 20 20  ast 1.  */.     
27ad0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
27ae0 5f 44 42 20 7c 7c 20 70 42 74 2d 3e 6e 50 61 67  _DB || pBt->nPag
27af0 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e>0 );.    }.   
27b00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
27b10 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
27b20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27b30 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
27b40 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
27b50 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
27b60 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
27b70 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61  iTable. If a rea
27b80 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73  d-only cursor is
27b90 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
27ba0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
27bb0 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72  * the caller alr
27bc0 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73  eady has at leas
27bd0 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  t a read-only tr
27be0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a  ansaction open.*
27bf0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
27c00 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20  e already. If a 
27c10 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
27c20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a  requested, then.
27c30 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  ** the caller is
27c40 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65   assumed to have
27c50 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
27c60 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
27c70 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57  * If the BTREE_W
27c80 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c  RCSR bit of wrFl
27c90 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65  ag is clear, the
27ca0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
27cb0 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64   only.** be used
27cc0 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49   for reading.  I
27cd0 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53  f the BTREE_WRCS
27ce0 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68  R bit is set, th
27cf0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  en the cursor.**
27d00 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
27d10 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20   reading or for 
27d20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
27d30 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
27d40 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61  writing.** are a
27d50 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20  lso met.  These 
27d60 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
27d70 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
27d80 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  met in order.** 
27d90 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62  for writing to b
27da0 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
27db0 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
27dc0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
27dd0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
27de0 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52  g containing BTR
27df0 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32  EE_WRCSR.**.** 2
27e00 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
27e10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
27e20 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
27e30 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
27e40 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
27e50 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
27e60 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
27e70 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
27e80 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
27e90 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
27ea0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
27eb0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
27ec0 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
27ed0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
27ee0 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
27ef0 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
27f00 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
27f10 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
27f20 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
27f30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
27f40 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
27f50 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
27f60 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
27f70 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
27f80 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
27f90 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
27fa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
27fb0 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f  .** The BTREE_FO
27fc0 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77  RDELETE bit of w
27fd0 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e  rFlag may option
27fe0 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20 42  ally be set if B
27ff0 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73  TREE_WRCSR.** is
28000 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c   set.  If FORDEL
28010 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61 74  ETE is set, that
28020 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68   is a hint to th
28030 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
28040 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75   that.** this cu
28050 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62  rsor will only b
28060 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74  e used to seek t
28070 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74  o and delete ent
28080 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78  ries of an index
28090 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61  .** as part of a
280a0 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20 73   larger DELETE s
280b0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46  tatement.  The F
280c0 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73  ORDELETE hint is
280d0 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20   not used by.** 
280e0 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
280f0 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68  ion.  But in a h
28100 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65  ypothetical alte
28110 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20  rnative storage 
28120 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68  engine .** in wh
28130 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65  ich index entrie
28140 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
28150 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e  lly deleted when
28160 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
28170 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65  able.** rows are
28180 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f   deleted, the FO
28190 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20  RDELETE flag is 
281a0 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20  a hint that all 
281b0 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a  SEEK and DELETE.
281c0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e  ** operations on
281d0 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e   this cursor can
281e0 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61   be no-ops and a
281f0 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f  ll READ operatio
28200 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72  ns can .** retur
28210 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d  n a null row (2-
28220 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30 30  bytes: 0x01 0x00
28230 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  )..**.** No chec
28240 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
28250 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
28260 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
28270 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
28280 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
28290 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
282a0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
282b0 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
282c0 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
282d0 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
282e0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
282f0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
28300 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
28310 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
28320 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
28330 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
28340 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
28350 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
28360 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
28370 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
28380 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
283b0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
283c0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
283f0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
28400 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
28410 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28430 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
28440 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
28450 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
28460 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
28470 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
28480 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
28490 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
284a0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284c0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
284d0 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
284e0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
284f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
28500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
28510 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
28520 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  dle */.  BtCurso
28530 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28550 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  /* Looping over 
28560 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72  other all cursor
28570 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
28580 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
28590 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
285a0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
285b0 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
285c0 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20  ag==BTREE_WRCSR 
285d0 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61  .       || wrFla
285e0 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c  g==(BTREE_WRCSR|
285f0 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29  BTREE_FORDELETE)
28600 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65   .  );..  /* The
28610 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
28620 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72  t statements ver
28630 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73  ify that if this
28640 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a   is a sharable .
28650 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61    ** b-tree data
28660 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63  base, the connec
28670 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
28680 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
28690 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20  le locks, .  ** 
286a0 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  and that no othe
286b0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
286c0 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
286d0 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20   that conflicts 
286e0 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20  with .  ** this 
286f0 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
28700 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
28710 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  heTableLock(p, i
28720 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21  Table, pKeyInfo!
28730 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29  =0, (wrFlag?2:1)
28740 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
28750 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73  rFlag==0 || !has
28760 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
28770 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f   iTable) );..  /
28780 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
28790 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65  e caller has ope
287a0 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64  ned the required
287b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f   transaction. */
287c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
287d0 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
287e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
287f0 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e  Flag==0 || p->in
28800 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
28810 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
28820 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70  pBt->pPage1 && p
28830 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
28840 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  a );.  assert( w
28850 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74  rFlag==0 || (pBt
28860 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
28870 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29  _READ_ONLY)==0 )
28880 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20  ;..  if( wrFlag 
28890 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  ){.    allocateT
288a0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
288b0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
288c0 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
288d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
288e0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  KPT;.  }.  if( i
288f0 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65  Table==1 && btre
28900 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  ePagecount(pBt)=
28910 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
28920 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  ( wrFlag==0 );. 
28930 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20     iTable = 0;. 
28940 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
28950 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
28960 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
28970 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
28980 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
28990 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
289a0 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
289b0 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
289c0 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
289d0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
289e0 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
289f0 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
28a00 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
28a10 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
28a20 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
28a30 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
28a40 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46  Bt;.  pCur->curF
28a50 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20  lags = wrFlag ? 
28a60 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a  BTCF_WriteFlag :
28a70 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50   0;.  pCur->curP
28a80 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  agerFlags = wrFl
28a90 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47  ag ? 0 : PAGER_G
28aa0 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f  ET_READONLY;.  /
28ab0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74  * If there are t
28ac0 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f  wo or more curso
28ad0 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62  rs on the same b
28ae0 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73  tree, then all s
28af0 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73  uch.  ** cursors
28b00 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65   *must* have the
28b10 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
28b20 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f  lag set. */.  fo
28b30 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f  r(pX=pBt->pCurso
28b40 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  r; pX; pX=pX->pN
28b50 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58  ext){.    if( pX
28b60 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e  ->pgnoRoot==(Pgn
28b70 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  o)iTable ){.    
28b80 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c    pX->curFlags |
28b90 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b  = BTCF_Multiple;
28ba0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
28bb0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
28bc0 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  ltiple;.    }.  
28bd0 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  }.  pCur->pNext 
28be0 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
28bf0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
28c00 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
28c10 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
28c20 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e  NVALID;.  return
28c30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
28c40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
28c50 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
28c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
28c90 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
28ca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cc0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
28cd0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
28ce0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d10 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
28d20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
28d30 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
28d40 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28d60 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
28d70 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
28d80 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28da0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
28db0 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
28dc0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
28dd0 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31  ;.  if( iTable<1
28de0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
28df0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28e00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
28e10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
28e20 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  (p);.    rc = bt
28e30 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
28e40 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
28e50 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
28e60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
28e70 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
28e80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28e90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
28ea0 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
28eb0 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
28ec0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
28ed0 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
28ee0 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
28ef0 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
28f00 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
28f10 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
28f20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
28f30 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
28f40 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
28f50 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
28f60 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
28f70 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
28f80 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
28f90 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
28fa0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
28fb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
28fc0 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
28fd0 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69  return ROUND8(si
28fe0 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b  zeof(BtCursor));
28ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
29000 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  lize memory that
29010 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
29020 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73  ed into a BtCurs
29030 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  or object..**.**
29040 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72   The simple appr
29050 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20  oach here would 
29060 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74  be to memset() t
29070 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74  he entire object
29080 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75  .** to zero.  Bu
29090 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74  t it turns out t
290a0 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d  hat the apPage[]
290b0 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72   and aiIdx[] arr
290c0 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65  ays.** do not ne
290d0 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20  ed to be zeroed 
290e0 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72  and they are lar
290f0 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61  ge, so we can sa
29100 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72  ve a lot.** of r
29110 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70  un-time by skipp
29120 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
29130 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20  zation of those 
29140 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  elements..*/.voi
29150 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
29160 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f  rsorZero(BtCurso
29170 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28  r *p){.  memset(
29180 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42  p, 0, offsetof(B
29190 74 43 75 72 73 6f 72 2c 20 42 54 43 55 52 53 4f  tCursor, BTCURSO
291a0 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49 54 29 29  R_FIRST_UNINIT))
291b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
291c0 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
291d0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
291e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
291f0 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
29200 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
29210 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
29220 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
29230 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
29240 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
29250 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
29260 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
29270 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
29280 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
29290 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20  = pCur->pBt;.   
292a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
292b0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
292c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75  assert( pBt->pCu
292d0 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  rsor!=0 );.    i
292e0 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  f( pBt->pCursor=
292f0 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70  =pCur ){.      p
29300 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
29310 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
29320 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75  else{.      BtCu
29330 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42  rsor *pPrev = pB
29340 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  t->pCursor;.    
29350 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66    do{.        if
29360 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ( pPrev->pNext==
29370 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  pCur ){.        
29380 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d    pPrev->pNext =
29390 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
293a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
293b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
293c0 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e   pPrev = pPrev->
293d0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68  pNext;.      }wh
293e0 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65  ile( ALWAYS(pPre
293f0 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  v) );.    }.    
29400 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
29410 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
29420 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
29430 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
29440 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29450 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
29460 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
29470 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
29480 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
29490 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
294a0 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65      pCur->pBtree
294b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
294c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
294d0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
294e0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
294f0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
29500 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
29510 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
29520 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
29530 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29540 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
29550 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
29560 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
29570 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
29580 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
29590 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
295a0 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
295b0 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
295c0 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
295d0 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
295e0 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
295f0 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f  eParseCell()..*/
29600 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
29610 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c    static int cel
29620 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c 6c 49  lInfoEqual(CellI
29630 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e 66 6f  nfo *a, CellInfo
29640 20 2a 62 29 7b 0a 20 20 20 20 69 66 28 20 61 2d   *b){.    if( a-
29650 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79 20 29  >nKey!=b->nKey )
29660 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
29670 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64 21 3d  f( a->pPayload!=
29680 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20 72 65  b->pPayload ) re
29690 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
296a0 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62 2d 3e  a->nPayload!=b->
296b0 6e 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72  nPayload ) retur
296c0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e  n 0;.    if( a->
296d0 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63 61  nLocal!=b->nLoca
296e0 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  l ) return 0;.  
296f0 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65 21 3d    if( a->nSize!=
29700 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74 75 72  b->nSize ) retur
29710 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 0;.    return 
29720 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20  1;.  }.  static 
29730 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
29740 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
29750 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
29760 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73  o info;.    mems
29770 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
29780 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
29790 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
297a0 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
297b0 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  ->ix, &info);.  
297c0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
297d0 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e 66 6f  T_DB || cellInfo
297e0 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26 70 43  Equal(&info, &pC
297f0 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20 20 7d  ur->info) );.  }
29800 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
29810 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
29820 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  x).#endif.static
29830 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
29840 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
29850 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
29860 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ){.  if( pCur->i
29870 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
29880 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
29890 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
298a0 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
298b0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
298c0 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26 70  Page,pCur->ix,&p
298d0 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65  Cur->info);.  }e
298e0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43  lse{.    assertC
298f0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
29900 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
29910 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
29920 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
29930 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
29940 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
29950 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
29960 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
29970 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
29980 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
29990 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
299a0 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
299b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
299c0 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
299d0 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
299e0 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
299f0 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
29a00 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
29a10 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
29a20 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
29a30 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
29a40 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
29a50 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
29a60 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
29a70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29a80 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
29a90 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71  NDEBUG */.int sq
29aa0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
29ab0 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73  IsValidNN(BtCurs
29ac0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
29ad0 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
29ae0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
29af0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29b00 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LID;.}../*.** Re
29b10 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
29b20 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
29b30 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72  y or "rowid" for
29b40 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a   a table btree..
29b50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29b60 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  is only valid fo
29b70 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
29b80 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
29b90 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74   a.** ordinary t
29ba0 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20  able btree.  If 
29bb0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
29bc0 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74  s to an index bt
29bd0 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76  ree or.** is inv
29be0 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74  alid, the result
29bf0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
29c00 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
29c10 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
29c20 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43  eeIntegerKey(BtC
29c30 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
29c40 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29c50 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29c60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29c70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29c80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
29c90 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
29ca0 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  Key );.  getCell
29cb0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
29cc0 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
29cd0 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  nKey;.}..#ifdef 
29ce0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
29cf0 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a  FSET_SQL_FUNC./*
29d00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
29d10 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 64  ffset into the d
29d20 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
29d30 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
29d40 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f 20  e.** payload to 
29d50 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
29d60 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f   is pointing..*/
29d70 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  .i64 sqlite3Btre
29d80 65 4f 66 66 73 65 74 28 42 74 43 75 72 73 6f 72  eOffset(BtCursor
29d90 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
29da0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
29db0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
29dc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29dd0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29de0 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
29df0 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
29e00 72 6e 20 28 69 36 34 29 70 43 75 72 2d 3e 70 42  rn (i64)pCur->pB
29e10 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28 69 36  t->pageSize*((i6
29e20 34 29 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70  4)pCur->pPage->p
29e30 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20 20  gno - 1) +.     
29e40 20 20 20 20 28 69 36 34 29 28 70 43 75 72 2d 3e      (i64)(pCur->
29e50 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20  info.pPayload - 
29e60 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61  pCur->pPage->aDa
29e70 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ta);.}.#endif /*
29e80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
29e90 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20 2a  FFSET_SQL_FUNC *
29ea0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
29eb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
29ec0 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66  tes of payload f
29ed0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
29ee0 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72  t pCur is.** cur
29ef0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
29f00 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62  to.  For table b
29f10 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c  trees, this will
29f20 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   be the amount.*
29f30 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20  * of data.  For 
29f40 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74 68  index btrees, th
29f50 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73  is will be the s
29f60 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a  ize of the key..
29f70 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
29f80 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
29f90 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
29fa0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
29fb0 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
29fc0 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
29fd0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
29fe0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
29ff0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
2a000 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
2a010 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
2a020 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a030 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  ID..*/.u32 sqlit
2a040 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
2a050 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
2a060 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
2a070 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2a080 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2a090 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a0a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a0b0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
2a0c0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur);.  return pC
2a0d0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
2a0e0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
2a0f0 72 6e 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e  rn an upper boun
2a100 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  d on the size of
2a110 20 61 6e 79 20 72 65 63 6f 72 64 20 66 6f 72 20   any record for 
2a120 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 74 68 61  the table.** tha
2a130 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
2a140 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 2e 0a 2a  pointing into..*
2a150 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
2a160 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 45  optimization.  E
2a170 76 65 72 79 74 68 69 6e 67 20 77 69 6c 6c 20 73  verything will s
2a180 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 74 68 69  till work if thi
2a190 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6c 77  s.** routine alw
2a1a0 61 79 73 20 72 65 74 75 72 6e 73 20 32 31 34 37  ays returns 2147
2a1b0 34 38 33 36 34 37 20 28 77 68 69 63 68 20 69 73  483647 (which is
2a1c0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 65 63   the largest rec
2a1d0 6f 72 64 0a 2a 2a 20 74 68 61 74 20 53 51 4c 69  ord.** that SQLi
2a1e0 74 65 20 63 61 6e 20 68 61 6e 64 6c 65 29 20 6f  te can handle) o
2a1f0 72 20 6d 6f 72 65 2e 20 20 42 75 74 20 72 65 74  r more.  But ret
2a200 75 72 6e 69 6e 67 20 61 20 73 6d 61 6c 6c 65 72  urning a smaller
2a210 20 76 61 6c 75 65 20 6d 69 67 68 74 0a 2a 2a 20   value might.** 
2a220 70 72 65 76 65 6e 74 20 6c 61 72 67 65 20 6d 65  prevent large me
2a230 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
2a240 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
2a250 69 6e 74 65 72 70 72 65 74 20 61 0a 2a 2a 20 63  interpret a.** c
2a260 6f 72 72 75 70 74 20 64 61 74 72 61 62 61 73 65  orrupt datrabase
2a270 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
2a280 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
2a290 6f 6e 20 6d 65 72 65 6c 79 20 72 65 74 75 72 6e  on merely return
2a2a0 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
2a2b0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
2a2c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2a2d0 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
2a2e0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 52  sqlite3BtreeMaxR
2a2f0 65 63 6f 72 64 53 69 7a 65 28 42 74 43 75 72 73  ecordSize(BtCurs
2a300 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
2a310 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2a320 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2a330 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a340 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a350 4c 49 44 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  LID );.  return 
2a360 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53  pCur->pBt->pageS
2a370 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
2a380 6e 74 36 34 29 70 43 75 72 2d 3e 70 42 74 2d 3e  nt64)pCur->pBt->
2a390 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
2a3a0 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
2a3b0 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
2a3c0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
2a3d0 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
2a3e0 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
2a3f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
2a400 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
2a410 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
2a420 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
2a430 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
2a440 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
2a450 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
2a460 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
2a470 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
2a480 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
2a490 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
2a4a0 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
2a4b0 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
2a4c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2a4d0 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
2a4e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2a4f0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
2a500 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
2a510 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2a520 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
2a530 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
2a540 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
2a550 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
2a560 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
2a570 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
2a580 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
2a590 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
2a5a0 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
2a5b0 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
2a5c0 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
2a5d0 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
2a5e0 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
2a5f0 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
2a600 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
2a610 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
2a620 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
2a630 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
2a640 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
2a650 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
2a660 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
2a670 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
2a680 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
2a690 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
2a6a0 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
2a6b0 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
2a6c0 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
2a6d0 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
2a6e0 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
2a6f0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
2a700 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
2a710 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
2a720 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
2a730 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
2a740 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
2a750 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
2a760 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
2a770 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
2a780 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2a790 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2a7a0 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a7c0 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
2a7d0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
2a7e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
2a7f0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
2a800 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
2a810 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
2a820 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
2a830 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
2a840 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2a850 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
2a860 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
2a870 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
2a880 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a890 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
2a8a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2a8b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2a8c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2a8d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2a8e0 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
2a8f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a900 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2a910 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
2a920 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
2a930 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
2a940 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
2a950 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
2a960 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
2a970 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
2a980 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
2a990 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
2a9a0 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
2a9b0 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
2a9c0 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
2a9d0 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
2a9e0 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
2a9f0 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
2aa00 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
2aa10 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
2aa20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2aa30 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
2aa40 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
2aa50 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2aa60 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
2aa70 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
2aa80 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
2aa90 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
2aaa0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
2aab0 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
2aac0 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
2aad0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2aae0 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
2aaf0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
2ab00 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65  f( iGuess<=btree
2ab10 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
2ab20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
2ab30 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
2ab40 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
2ab50 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2ab60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
2ab70 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
2ab80 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
2ab90 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
2aba0 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
2abb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2abc0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
2abd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2abe0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78  f..  assert( nex
2abf0 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
2ac00 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
2ac10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ac20 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
2ac30 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
2ac40 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61  l, &pPage, (ppPa
2ac50 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47  ge==0) ? PAGER_G
2ac60 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
2ac70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
2ac80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
2ac90 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Page==0 );.    i
2aca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2acb0 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
2acc0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
2acd0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
2ace0 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
2acf0 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
2ad00 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
2ad10 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
2ad20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
2ad30 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2ad40 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
2ad50 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
2ad60 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
2ad70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
2ad80 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
2ad90 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
2ada0 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
2adb0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
2adc0 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
2add0 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
2ade0 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
2adf0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
2ae00 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
2ae10 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
2ae20 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
2ae30 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
2ae40 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
2ae50 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
2ae60 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
2ae70 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
2ae80 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
2ae90 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
2aea0 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
2aeb0 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
2aec0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
2aed0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
2aee0 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
2aef0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
2af00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2af10 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
2af20 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
2af30 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
2af40 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
2af50 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
2af60 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
2af70 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2af80 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
2af90 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
2afa0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2afb0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
2afc0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2afe0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2aff0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
2b000 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
2b010 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
2b020 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
2b030 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
2b040 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
2b050 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
2b060 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
2b070 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
2b080 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
2b090 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
2b0a0 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
2b0b0 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
2b0c0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
2b0d0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
2b0e0 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
2b0f0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2b100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b110 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b120 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
2b130 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
2b140 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
2b150 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
2b160 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
2b170 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
2b180 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
2b190 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
2b1a0 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
2b1b0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2b1c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2b1d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b1e0 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
2b1f0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
2b200 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
2b210 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
2b220 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
2b230 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
2b240 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61  to. The eOp.** a
2b250 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72  rgument is inter
2b260 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
2b270 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68  s:.**.**   0: Th
2b280 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
2b290 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20   read. Populate 
2b2a0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
2b2b0 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20  he..**   1: The 
2b2c0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77  operation is a w
2b2d0 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74  rite. Populate t
2b2e0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
2b2f0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
2b300 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
2b310 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
2b320 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
2b330 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
2b340 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
2b350 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
2b360 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
2b370 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
2b380 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
2b390 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
2b3a0 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
2b3b0 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
2b3c0 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
2b3d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
2b3e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2b3f0 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
2b400 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
2b410 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2b420 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  s.** this functi
2b430 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20  on may allocate 
2b440 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
2b450 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a  zily populate.**
2b460 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2b470 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
2b480 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
2b490 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
2b4a0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
2b4b0 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
2b4c0 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
2b4d0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
2b4e0 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
2b4f0 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
2b500 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
2b510 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
2b520 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
2b530 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a  ed, it must be.*
2b540 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
2b550 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
2b560 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
2b570 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
2b580 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
2b590 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
2b5a0 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
2b5b0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
2b5c0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
2b5d0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
2b5e0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
2b5f0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
2b600 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
2b610 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
2b620 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
2b630 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
2b640 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
2b650 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
2b660 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
2b670 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
2b680 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
2b690 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
2b6a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2b6b0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
2b6c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2b6d0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
2b6e0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
2b6f0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
2b700 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
2b710 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
2b720 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
2b730 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
2b740 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
2b750 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2b760 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
2b770 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2b780 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
2b790 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
2b7a0 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
2b7b0 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
2b7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
2b7d0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
2b7e0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
2b7f0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
2b800 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
2b810 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b820 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
2b830 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2b840 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2b850 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2b860 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65     /* Btree page
2b870 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
2b880 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
2b890 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
2b8a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b8b0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
2b8c0 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
2b8d0 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
2b8e0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
2b8f0 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
2b900 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
2b910 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
2b920 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  f;     /* Start 
2b930 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20  of original out 
2b940 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66  buffer */.#endif
2b950 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2b960 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  e );.  assert( e
2b970 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20  Op==0 || eOp==1 
2b980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b990 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b9a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2b9b0 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50  ert( pCur->ix<pP
2b9c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2b9d0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2b9e0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2b9f0 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ;..  getCellInfo
2ba00 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
2ba10 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
2ba20 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65  pPayload;.  asse
2ba30 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
2ba40 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
2ba50 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65  yload );..  asse
2ba60 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70  rt( aPayload > p
2ba70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
2ba80 20 69 66 28 20 28 75 70 74 72 29 28 61 50 61 79   if( (uptr)(aPay
2ba90 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44  load - pPage->aD
2baa0 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61  ata) > (pBt->usa
2bab0 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e  bleSize - pCur->
2bac0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a  info.nLocal) ){.
2bad0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
2bae0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
2baf0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2bb00 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
2bb10 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  ror.  The.    **
2bb20 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
2bb30 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20  ve is really:.  
2bb40 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61    **    &aPayloa
2bb50 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
2bb60 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
2bb70 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
2bb80 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74  Size].    ** but
2bb90 20 69 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20   is recast into 
2bba0 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d  its current form
2bbb0 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65   to avoid intege
2bbc0 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c  r overflow probl
2bbd0 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ems.    */.    r
2bbe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2bbf0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
2bc00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
2bc10 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
2bc20 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
2bc30 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
2bc40 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
2bc50 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
2bc60 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
2bc70 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
2bc80 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
2bc90 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
2bca0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
2bcb0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
2bcc0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
2bcd0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
2bce0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
2bcf0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
2bd00 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
2bd10 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2bd20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
2bd30 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
2bd40 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
2bd50 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
2bd60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
2bd70 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
2bd80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2bd90 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
2bda0 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
2bdb0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2bdc0 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
2bdd0 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
2bde0 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
2bdf0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
2be00 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
2be10 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
2be20 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
2be30 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
2be40 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
2be50 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
2be60 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
2be70 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
2be80 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
2be90 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
2bea0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
2beb0 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
2bec0 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
2bed0 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
2bee0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
2bef0 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
2bf00 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
2bf10 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
2bf20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
2bf30 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
2bf40 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
2bf50 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
2bf60 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
2bf70 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
2bf80 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
2bf90 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
2bfa0 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
2bfb0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2bfc0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2bfd0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
2bfe0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
2bff0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
2c000 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
2c010 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
2c020 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
2c030 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
2c040 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20  verflow==0.     
2c050 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29    || nOvfl*(int)
2c060 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73  sizeof(Pgno) > s
2c070 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65  qlite3MallocSize
2c080 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
2c090 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2c0a0 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
2c0b0 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
2c0c0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
2c0d0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
2c0e0 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
2c0f0 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
2c100 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2c110 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
2c120 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c130 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2c140 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c150 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
2c160 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
2c170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c180 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
2c190 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
2c1a0 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
2c1b0 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70 43  Pgno));.      pC
2c1c0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2c1d0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
2c1e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c1f0 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
2c200 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
2c210 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
2c220 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
2c230 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f       ** entry fo
2c240 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
2c250 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
2c260 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
2c270 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63  p.      ** direc
2c280 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 20  tly to it..     
2c290 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2c2a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
2c2b0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
2c2c0 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78 20 3d  {.        iIdx =
2c2d0 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
2c2e0 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  e);.        next
2c2f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
2c300 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
2c310 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
2c320 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
2c330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c340 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
2c350 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
2c360 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  t>0 );.    while
2c370 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20  ( nextPage ){.  
2c380 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
2c390 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
2c3a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
2c3b0 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
2c3c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c3d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
2c3e0 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  ]==0.           
2c3f0 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65     || pCur->aOve
2c400 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
2c410 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 20  tPage.          
2c420 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
2c430 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  B );.      pCur-
2c440 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
2c450 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20   = nextPage;..  
2c460 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
2c470 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
2c480 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
2c490 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
2c4a0 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
2c4b0 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
2c4c0 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
2c4d0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
2c4e0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
2c4f0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
2c500 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
2c510 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
2c520 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
2c530 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
2c540 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
2c550 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
2c560 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
2c570 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
2c580 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
2c590 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
2c5a0 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
2c5b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2c5c0 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  rt( pCur->curFla
2c5d0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2c5e0 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61  vfl );.        a
2c5f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74  ssert( pCur->pBt
2c600 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62  ree->db==pBt->db
2c610 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2c620 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2c630 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
2c640 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
2c650 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2c660 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
2c670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c680 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
2c690 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
2c6a0 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
2c6b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2c6c0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
2c6d0 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
2c6e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c6f0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
2c700 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
2c710 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
2c720 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
2c730 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
2c740 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
2c750 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
2c760 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
2c770 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
2c780 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
2c790 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
2c7a0 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
2c7b0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
2c7c0 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
2c7d0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
2c7e0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
2c7f0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
2c800 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
2c810 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
2c820 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2c830 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
2c840 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
2c850 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
2c860 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
2c870 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
2c880 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
2c890 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
2c8a0 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
2c8b0 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
2c8c0 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 61   **   3) there a
2c8d0 72 65 20 6e 6f 20 64 69 72 74 79 20 70 61 67 65  re no dirty page
2c8e0 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
2c8f0 63 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  che.        **  
2c900 20 34 29 20 74 68 65 20 64 61 74 61 62 61 73 65   4) the database
2c910 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
2c920 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
2c930 20 20 35 29 20 74 68 65 20 70 61 67 65 20 69 73    5) the page is
2c940 20 6e 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20   not in the WAL 
2c950 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  file.        ** 
2c960 20 20 36 29 20 61 74 20 6c 65 61 73 74 20 34 20    6) at least 4 
2c970 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
2c980 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
2c990 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
2c9a0 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
2c9b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2c9c0 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
2c9d0 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
2c9e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c9f0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
2ca00 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
2ca10 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
2ca20 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
2ca30 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
2ca40 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
2ca50 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
2ca60 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
2ca70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
2ca80 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
2ca90 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  */.        if( e
2caa0 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  Op==0           
2cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cad0 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
2cae0 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
2caf0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
2cb20 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
2cb30 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72   sqlite3PagerDir
2cb40 65 63 74 52 65 61 64 4f 6b 28 70 42 74 2d 3e 70  ectReadOk(pBt->p
2cb50 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 29  Pager, nextPage)
2cb60 20 20 20 20 2f 2a 20 28 33 2c 34 2c 35 29 20 2a      /* (3,4,5) *
2cb70 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
2cb80 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
2cb90 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
2cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbb0 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   /* (6) */.     
2cbc0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2cbd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
2cbe0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
2cbf0 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
2cc00 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  ;.          u8 a
2cc10 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
2cc20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
2cc30 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
2cc40 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
2cc50 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
2cc60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cc70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65            /* due
2cc80 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   to (6) */.     
2cc90 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
2cca0 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
2ccb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2ccc0 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
2ccd0 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
2cce0 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
2ccf0 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
2cd00 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
2cd10 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
2cd20 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
2cd30 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
2cd40 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
2cd50 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
2cd60 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2cd70 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
2cd80 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
2cd90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2cda0 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
2cdb0 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
2cdc0 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
2cdd0 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47     (eOp==0 ? PAG
2cde0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
2cdf0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
2ce00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ce10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ce20 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
2ce30 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
2ce40 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
2ce50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2ce60 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
2ce70 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
2ce80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2ce90 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
2cea0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
2ceb0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
2cec0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
2ced0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2cee0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
2cef0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
2cf00 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
2cf10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2cf20 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
2cf30 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  a;.        if( a
2cf40 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  mt==0 ) return r
2cf50 63 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  c;.        pBuf 
2cf60 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
2cf70 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2cf80 61 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b  ak;.      iIdx++
2cf90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
2cfa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cfb0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
2cfc0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61   /* Overflow cha
2cfd0 69 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72  in ends prematur
2cfe0 65 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ely */.    retur
2cff0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2d000 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
2d010 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2d020 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
2d030 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64  t of the payload
2d040 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20   for the row at 
2d050 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f  which that curso
2d060 72 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e  r pCur is curren
2d070 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  tly.** pointing.
2d080 20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69    "amt" bytes wi
2d090 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
2d0a0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
2d0b0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
2d0c0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
2d0d0 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63  t"..**.** pCur c
2d0e0 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  an be pointing t
2d0f0 6f 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65  o either a table
2d100 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   or an index b-t
2d110 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74  ree..** If point
2d120 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62  ing to a table b
2d130 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63  tree, then the c
2d140 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69  ontent section i
2d150 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70  s read.  If.** p
2d160 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
2d170 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
2d180 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ee then the key 
2d190 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
2d1a0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74  .**.** For sqlit
2d1b0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29  e3BtreePayload()
2d1c0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
2d1d0 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
2d1e0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a  ur is pointing.*
2d1f0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  * to a valid row
2d200 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2d210 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
2d220 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29  PayloadChecked()
2d230 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  , the.** cursor 
2d240 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64  might be invalid
2d250 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74   or might need t
2d260 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65  o be restored be
2d270 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e  fore being read.
2d280 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
2d290 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
2d2a0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
2d2b0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
2d2c0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
2d2d0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
2d2e0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
2d2f0 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
2d300 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
2d310 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
2d320 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2d330 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f  ePayload(BtCurso
2d340 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
2d350 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
2d360 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
2d370 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2d380 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2d390 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2d3a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2d3b0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2d3c0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2d3d0 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  && pCur->pPage )
2d3e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d3f0 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
2d400 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
2d410 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
2d420 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
2d430 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
2d440 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
2d450 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72  ../*.** This var
2d460 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42  iant of sqlite3B
2d470 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f  treePayload() wo
2d480 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  rks even if the 
2d490 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a  cursor has not.*
2d4a0 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f  * in the CURSOR_
2d4b0 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74  VALID state.  It
2d4c0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
2d4d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
2d4e0 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65  b_read().** inte
2d4f0 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rface..*/.#ifnde
2d500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
2d510 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51  CRBLOB.static SQ
2d520 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2d530 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  t accessPayloadC
2d540 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  hecked(.  BtCurs
2d550 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20  or *pCur,.  u32 
2d560 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d  offset,.  u32 am
2d570 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a  t,.  void *pBuf.
2d580 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2d590 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
2d5a0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
2d5b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d5c0 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
2d5d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2d5e0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2d5f0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ur) );.  rc = bt
2d600 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
2d610 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2d620 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63    return rc ? rc
2d630 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   : accessPayload
2d640 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
2d650 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  mt, pBuf, 0);.}.
2d660 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2d670 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42  PayloadChecked(B
2d680 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
2d690 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
2d6a0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
2d6b0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2d6c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2d6d0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2d6e0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2d6f0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20  red(pCur) );.   
2d700 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
2d710 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
2d720 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
2d730 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d740 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
2d750 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75 72  loadChecked(pCur
2d760 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
2d770 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Buf);.  }.}.#end
2d780 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2d790 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f  T_INCRBLOB */../
2d7a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
2d7b0 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
2d7c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2d7d0 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
2d7e0 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
2d7f0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
2d800 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
2d810 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
2d820 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
2d830 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
2d840 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
2d850 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
2d860 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
2d870 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
2d880 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
2d890 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2d8a0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
2d8b0 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
2d8c0 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
2d8d0 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
2d8e0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
2d8f0 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
2d900 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
2d910 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
2d920 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
2d930 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
2d940 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
2d950 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
2d960 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
2d970 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
2d980 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
2d990 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
2d9a0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
2d9b0 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
2d9c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
2d9d0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
2d9e0 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
2d9f0 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
2da00 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
2da10 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
2da20 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
2da30 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
2da40 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
2da50 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
2da60 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
2da70 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
2da80 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
2da90 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
2daa0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
2dab0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
2dac0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
2dad0 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
2dae0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
2daf0 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
2db00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2db10 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
2db20 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
2db30 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
2db40 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
2db50 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
2db60 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
2db70 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
2db80 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
2db90 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
2dba0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
2dbb0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
2dbc0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
2dbd0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
2dbe0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
2dbf0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
2dc00 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
2dc10 20 69 6e 74 20 61 6d 74 3b 0a 20 20 61 73 73 65   int amt;.  asse
2dc20 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
2dc30 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
2dc40 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20   pCur->pPage);. 
2dc50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2dc60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2dc70 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2dc80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2dc90 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2dca0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2dcb0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2dcc0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2dcd0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2dce0 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
2dcf0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2dd00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2dd10 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
2dd20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2dd30 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75  nfo.pPayload>pCu
2dd40 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 20  r->pPage->aData 
2dd50 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
2dd60 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2dd70 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70  >info.pPayload<p
2dd80 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
2dd90 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
2dda0 42 29 3b 0a 20 20 61 6d 74 20 3d 20 70 43 75 72  B);.  amt = pCur
2ddb0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
2ddc0 20 69 66 28 20 61 6d 74 3e 28 69 6e 74 29 28 70   if( amt>(int)(p
2ddd0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
2dde0 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
2ddf0 6f 2e 70 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20  o.pPayload) ){. 
2de00 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 74     /* There is t
2de10 6f 6f 20 6c 69 74 74 6c 65 20 73 70 61 63 65 20  oo little space 
2de20 6f 6e 20 74 68 65 20 70 61 67 65 20 66 6f 72 20  on the page for 
2de30 74 68 65 20 65 78 70 65 63 74 65 64 20 61 6d 6f  the expected amo
2de40 75 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f  unt.    ** of lo
2de50 63 61 6c 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74  cal content. Dat
2de60 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2de70 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73  rrupt. */.    as
2de80 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
2de90 20 29 3b 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41   );.    amt = MA
2dea0 58 28 30 2c 20 28 69 6e 74 29 28 70 43 75 72 2d  X(0, (int)(pCur-
2deb0 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
2dec0 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
2ded0 61 79 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20  ayload));.  }.  
2dee0 2a 70 41 6d 74 20 3d 20 28 75 33 32 29 61 6d 74  *pAmt = (u32)amt
2def0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
2df00 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  *)pCur->info.pPa
2df10 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
2df20 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
2df30 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
2df40 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
2df50 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
2df60 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
2df70 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
2df80 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
2df90 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
2dfa0 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
2dfb0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
2dfc0 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
2dfd0 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
2dfe0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
2dff0 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
2e000 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
2e010 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
2e020 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
2e030 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
2e040 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
2e050 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
2e060 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
2e070 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
2e080 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
2e090 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
2e0a0 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
2e0b0 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
2e0c0 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
2e0d0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2e0e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
2e0f0 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
2e100 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
2e110 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
2e120 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
2e130 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
2e140 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
2e150 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
2e160 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
2e170 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74  3BtreePayloadFet
2e180 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
2e190 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
2e1a0 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
2e1b0 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
2e1c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
2e1d0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
2e1e0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
2e1f0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
2e200 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
2e210 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
2e220 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
2e230 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
2e240 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2e250 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2e260 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
2e270 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
2e280 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
2e290 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
2e2a0 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
2e2b0 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
2e2c0 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
2e2d0 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
2e2e0 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
2e2f0 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
2e300 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
2e310 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
2e320 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
2e330 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2e340 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
2e350 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
2e360 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  no){.  BtShared 
2e370 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
2e380 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
2e390 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2e3a0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2e3b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e3c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2e3d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2e3e0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2e3f0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
2e400 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
2e410 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2e420 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
2e430 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
2e440 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
2e450 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e460 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2e470 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f    }.  pCur->info
2e480 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2e490 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2e4a0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2e4b0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2e4c0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
2e4d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
2e4e0 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d  Cur->ix;.  pCur-
2e4f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e500 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70 50 61  age] = pCur->pPa
2e510 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  ge;.  pCur->ix =
2e520 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
2e530 65 2b 2b 3b 0a 20 20 72 63 20 3d 20 67 65 74 41  e++;.  rc = getA
2e540 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
2e550 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
2e560 70 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  pPage,.         
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e580 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61  Cur, pCur->curPa
2e590 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 69 66 28  gerFlags);.  if(
2e5a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e5b0 7b 0a 20 20 20 20 73 65 74 4d 65 6d 70 61 67 65  {.    setMempage
2e5c0 52 6f 6f 74 28 70 43 75 72 2d 3e 70 50 61 67 65  Root(pCur->pPage
2e5d0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2e5e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2e5f0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
2e600 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2e610 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
2e620 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
2e630 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
2e640 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2e650 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
2e660 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
2e670 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
2e680 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
2e690 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
2e6a0 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
2e6b0 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
2e6c0 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
2e6d0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
2e6e0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
2e6f0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
2e700 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
2e710 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
2e720 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2e730 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
2e740 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
2e750 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
2e760 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
2e770 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52  ild){.  if( CORR
2e780 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
2e790 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69    /* The conditi
2e7a0 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77  ons tested below
2e7b0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72   might not be tr
2e7c0 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ue.             
2e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2e7e0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64  * in a corrupt d
2e7f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73  atabase */.  ass
2e800 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
2e810 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
2e820 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
2e830 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
2e840 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
2e850 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2e860 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2e870 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
2e880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2e890 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
2e8a0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
2e8b0 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
2e8c0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
2e8d0 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
2e8e0 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
2e8f0 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
2e900 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2e910 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
2e920 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
2e930 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
2e940 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
2e950 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
2e960 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
2e970 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
2e980 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
2e990 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
2e9a0 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
2e9b0 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
2e9c0 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
2e9d0 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
2e9e0 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
2e9f0 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
2ea00 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
2ea10 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
2ea20 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2ea30 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65  {.  MemPage *pLe
2ea40 61 66 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  af;.  assert( cu
2ea50 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2ea60 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ea70 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2ea80 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2ea90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2eaa0 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
2eab0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2eac0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  ge );.  assertPa
2ead0 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
2eae0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2eaf0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
2eb00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2eb10 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
2eb20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70    pCur->pPage->p
2eb30 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63  gno.  );.  testc
2eb40 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
2eb50 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
2eb60 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
2eb70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
2eb80 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Cell );.  pCur->
2eb90 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2eba0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2ebb0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2ebc0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2ebd0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78  vfl);.  pCur->ix
2ebe0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2ebf0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20  Cur->iPage-1];. 
2ec00 20 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 70   pLeaf = pCur->p
2ec10 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50  Page;.  pCur->pP
2ec20 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2ec30 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65  ge[--pCur->iPage
2ec40 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ];.  releasePage
2ec50 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a  NotNull(pLeaf);.
2ec60 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2ec70 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
2ec80 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
2ec90 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
2eca0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
2ecb0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
2ecc0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
2ecd0 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
2ece0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
2ecf0 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
2ed00 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
2ed10 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
2ed20 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
2ed30 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
2ed40 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
2ed50 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
2ed60 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
2ed70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
2ed80 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
2ed90 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
2eda0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2edb0 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
2edc0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
2edd0 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
2ede0 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
2edf0 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
2ee00 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
2ee10 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
2ee20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61  CURSOR_INVALID a
2ee30 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
2ee40 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45  returns SQLITE_E
2ee50 4d 50 54 59 2e 20 4f 74 68 65 72 77 69 73 65 2c  MPTY. Otherwise,
2ee60 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
2ee70 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
2ee80 6f 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  o the first cell
2ee90 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
2eea0 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74  root.** (or virt
2eeb0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
2eec0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
2eed0 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
2eee0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
2eef0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
2ef00 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
2ef10 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
2ef20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
2ef30 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
2ef40 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
2ef50 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
2ef60 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
2ef70 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
2ef80 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
2ef90 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
2efa0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
2efb0 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
2efc0 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
2efd0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
2efe0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
2eff0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
2f000 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
2f010 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
2f020 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
2f030 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
2f040 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
2f050 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
2f060 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
2f070 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
2f080 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
2f090 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
2f0a0 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
2f0b0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
2f0c0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
2f0d0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2f0e0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
2f0f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2f100 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2f110 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2f120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2f130 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
2f140 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2f150 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
2f160 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
2f170 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2f180 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
2f190 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
2f1a0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2f1b0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
2f1c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3c 20   pCur->eState < 
2f1d0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2f1e0 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67  EK || pCur->iPag
2f1f0 65 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e<0 );.  assert(
2f200 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e   pCur->pgnoRoot>
2f210 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
2f220 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  <0 );..  if( pCu
2f230 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
2f240 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2f250 67 65 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  ge ){.      rele
2f260 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2f270 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
2f280 20 20 20 77 68 69 6c 65 28 20 2d 2d 70 43 75 72     while( --pCur
2f290 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2f2a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
2f2b0 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
2f2c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
2f2d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f2e0 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43  pCur->pPage = pC
2f2f0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
2f300 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69       goto skip_i
2f310 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  nit;.    }.  }el
2f320 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
2f330 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
2f340 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2f350 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2f360 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f370 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b  _EMPTY;.  }else{
2f380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2f390 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
2f3a0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
2f3b0 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
2f3c0 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
2f3d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
2f3e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2f3f0 4c 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LT ){.        as
2f400 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2f410 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
2f420 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2f430 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
2f440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f450 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2f460 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
2f470 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
2f480 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
2f490 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
2f4a0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2f4b0 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20  &pCur->pPage,.  
2f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4d0 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63        0, pCur->c
2f4e0 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20  urPagerFlags);. 
2f4f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
2f510 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2f520 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2f530 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f540 20 20 7d 0a 20 20 20 20 73 65 74 4d 65 6d 70 61    }.    setMempa
2f550 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e 70 50 61  geRoot(pCur->pPa
2f560 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ge, pCur->pgnoRo
2f570 6f 74 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  ot);.    pCur->i
2f580 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
2f590 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20  ur->curIntKey = 
2f5a0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
2f5b0 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  Key;.  }.  pRoot
2f5c0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2f5d0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
2f5e0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
2f5f0 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
2f600 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
2f610 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
2f620 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
2f630 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
2f640 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
2f650 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
2f660 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
2f670 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
2f680 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
2f690 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
2f6a0 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
2f6b0 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
2f6c0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
2f6d0 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
2f6e0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
2f6f0 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
2f700 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
2f710 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
2f720 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
2f730 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
2f740 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
2f750 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
2f760 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
2f770 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2f780 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
2f790 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
2f7a0 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
2f7b0 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
2f7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2f7d0 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
2f7e0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
2f7f0 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
2f800 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
2f810 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
2f820 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
2f830 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
2f840 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
2f850 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
2f860 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
2f870 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
2f880 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
2f890 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2f8a0 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
2f8b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2f8c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
2f8d0 45 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  E(pCur->pPage);.
2f8e0 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20    }..skip_init: 
2f8f0 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30   .  pCur->ix = 0
2f900 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2f910 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2f920 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2f930 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2f940 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2f950 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70  ValidOvfl);..  p
2f960 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
2f970 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  ge;.  if( pRoot-
2f980 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2f990 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2f9a0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
2f9b0 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
2f9c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
2f9d0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
2f9e0 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
2f9f0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
2fa00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2fa10 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
2fa20 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
2fa30 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
2fa40 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
2fa50 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2fa60 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2fa70 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2fa80 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
2fa90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2faa0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2fab0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2fac0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50   rc = SQLITE_EMP
2fad0 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  TY;.  }.  return
2fae0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
2faf0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2fb00 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
2fb10 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2fb20 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
2fb30 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
2fb40 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2fb50 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
2fb60 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
2fb70 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2fb80 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
2fb90 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
2fba0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2fbb0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2fbc0 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
2fbd0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2fbe0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2fbf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2fc00 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2fc10 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2fc20 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2fc30 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2fc40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2fc50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2fc60 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
2fc70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fc80 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2fc90 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
2fca0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2fcb0 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  ->ix<pPage->nCel
2fcc0 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
2fcd0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2fce0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2fcf0 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  x));.    rc = mo
2fd00 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2fd10 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2fd20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2fd30 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2fd40 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
2fd50 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
2fd60 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2fd70 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
2fd80 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2fd90 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
2fda0 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
2fdb0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
2fdc0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
2fdd0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2fde0 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
2fdf0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2fe00 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
2fe10 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2fe20 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
2fe30 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2fe40 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
2fe50 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
2fe60 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
2fe70 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
2fe80 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
2fe90 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2fea0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
2feb0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
2fec0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2fed0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2fee0 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
2fef0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2ff00 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2ff10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ff20 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2ff30 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
2ff40 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ff50 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ff60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2ff70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2ff80 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2ff90 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
2ffa0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
2ffb0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
2ffc0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2ffd0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2ffe0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2fff0 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65  pCur->ix = pPage
30000 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
30010 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
30020 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
30030 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30040 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  c;.  }.  pCur->i
30050 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
30060 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  -1;.  assert( pC
30070 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
30080 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
30090 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
300a0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
300b0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
300c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
300d0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
300e0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
300f0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
30100 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
30110 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
30120 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
30130 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
30140 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
30150 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
30160 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
30170 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
30180 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
30190 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
301a0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
301b0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
301c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
301d0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
301e0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
301f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30200 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
30210 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
30220 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
30230 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
30240 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
30250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
30260 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
30270 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
30280 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
30290 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
302a0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
302b0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
302c0 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61  E_EMPTY ){.    a
302d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
302e0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
302f0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
30300 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  0 );.    *pRes =
30310 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
30320 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
30330 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
30340 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
30350 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
30360 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
30370 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
30380 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
30390 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
303a0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
303b0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
303c0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
303d0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
303e0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
303f0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
30400 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
30410 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
30420 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
30430 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
30440 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
30450 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
30460 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
30470 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
30480 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
30490 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
304a0 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
304b0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
304c0 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
304d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
304e0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
304f0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
30500 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
30510 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
30520 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
30530 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
30540 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
30550 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
30560 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
30570 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
30580 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
30590 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
305a0 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
305b0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
305c0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
305d0 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
305e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
305f0 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
30600 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
30610 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
30620 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
30630 72 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61  r->ix==pCur->pPa
30640 67 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  ge->nCell-1 );. 
30650 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
30660 3e 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  >pPage->leaf );.
30670 23 65 6e 64 69 66 0a 20 20 20 20 2a 70 52 65 73  #endif.    *pRes
30680 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
30690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
306a0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
306b0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
306c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
306d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
306e0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
306f0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a  R_VALID );.    *
30700 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63  pRes = 0;.    rc
30710 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
30720 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  st(pCur);.    if
30730 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30740 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  ){.      pCur->c
30750 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
30760 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73  AtLast;.    }els
30770 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e{.      pCur->c
30780 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
30790 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20  _AtLast;.    }. 
307a0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
307b0 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
307c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
307d0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
307e0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
307f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
30800 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  es = 1;.    rc =
30810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
30820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30830 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
30840 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
30850 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
30860 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
30870 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
30880 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
30890 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
308a0 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
308b0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
308c0 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
308d0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
308e0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
308f0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
30900 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
30910 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
30920 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
30930 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
30940 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
30950 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
30960 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
30970 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
30980 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
30990 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
309a0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
309b0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
309c0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
309d0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
309e0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
309f0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
30a00 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
30a10 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
30a20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
30a30 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
30a40 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
30a50 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
30a60 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
30a70 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
30a80 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
30a90 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
30aa0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
30ab0 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
30ac0 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
30ad0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
30ae0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
30af0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
30b00 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
30b10 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
30b20 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
30b30 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
30b40 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
30b50 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
30b60 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
30b70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
30b80 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
30b90 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
30ba0 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
30bb0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
30bc0 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
30bd0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
30be0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
30bf0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
30c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
30c10 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
30c20 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
30c30 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
30c40 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
30c50 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
30c60 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
30c70 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
30c80 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
30c90 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
30ca0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
30cb0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
30cc0 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
30cd0 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
30ce0 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
30cf0 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
30d00 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
30d10 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
30d20 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
30d30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
30d40 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
30d50 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
30d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30d70 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
30d80 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
30d90 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
30da0 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
30db0 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
30dc0 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
30dd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
30de0 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
30df0 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
30e00 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
30e10 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
30e20 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
30e30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
30e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30e50 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
30e60 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
30e70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
30e80 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
30e90 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
30ea0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
30eb0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
30ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30ed0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30ee0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
30ef0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
30f00 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
30f10 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
30f20 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
30f30 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61  yInfo==0) );.  a
30f40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
30f50 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
30f60 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30  D || (pIdxKey==0
30f70 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74  )==(pCur->curInt
30f80 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Key!=0) );..  /*
30f90 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
30fa0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
30fb0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
30fc0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
30fd0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
30fe0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
30ff0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
31000 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
31010 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20  ( pIdxKey==0.   
31020 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
31030 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
31040 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
31050 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
31060 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  y)!=0.  ){.    i
31070 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
31080 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
31090 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
310a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
310b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
310c0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
310d0 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
310e0 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
310f0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
31100 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20  AtLast)!=0 ){.  
31110 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
31120 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
31130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31140 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
31150 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65  the requested ke
31160 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  y is one more th
31170 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
31180 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  key, then.      
31190 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74 68  ** try to get th
311a0 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ere using sqlite
311b0 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61 74  3BtreeNext() rat
311c0 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a  her than a full.
311d0 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20        ** binary 
311e0 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69 73  search.  This is
311f0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
31200 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72   only.  The corr
31210 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20  ect answer.     
31220 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74   ** is still obt
31230 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68  ained without th
31240 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20  is case, only a 
31250 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77  little more slow
31260 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ely */.      if(
31270 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
31280 2b 31 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  +1==intKey ){.  
31290 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
312a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
312b0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
312c0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
312d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
312e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
312f0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
31300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31310 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
31320 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
31330 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31340 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
31360 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
31370 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
31380 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31390 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
313a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
313b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
313c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
313d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
313e0 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
313f0 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
31400 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
31410 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
31420 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
31430 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
31440 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
31450 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
31460 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
31470 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
31480 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
31490 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
314a0 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
314b0 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
314c0 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
314d0 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
314e0 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
314f0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
31500 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
31510 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
31520 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
31530 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
31540 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
31550 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
31560 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
31570 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
31580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31590 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
315a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
315b0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
315c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
315d0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
315e0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
315f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
31600 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
31610 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
31620 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29  age->nCell > 0 )
31630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
31640 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43  ->iPage==0 || pC
31650 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
31660 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
31670 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
31680 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
31690 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
316a0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
316b0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
316c0 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
316d0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
316e0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
316f0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38  r->pPage;.    u8
31700 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
31710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31720 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
31730 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
31740 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
31750 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
31760 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
31770 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
31780 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
31790 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
317a0 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
317b0 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
317c0 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
317d0 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
317e0 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
317f0 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
31800 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
31810 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
31820 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
31830 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
31840 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
31850 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
31860 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
31870 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
31880 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
31890 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
318a0 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
318b0 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
318c0 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
318d0 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
318e0 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
318f0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
31900 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31910 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
31920 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
31930 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
31940 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
31950 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
31960 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
31970 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
31980 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
31990 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
319a0 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
319b0 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
319c0 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
319d0 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
319e0 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
319f0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
31a00 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
31a10 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
31a20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
31a30 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
31a40 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
31a50 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
31a60 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
31a70 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
31a80 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
31a90 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
31aa0 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
31ab0 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
31ac0 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
31ad0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a  ge->aDataEnd ){.
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
31af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
31b00 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
31b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
31b20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31b30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
31b40 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
31b50 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
31b60 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
31b70 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
31b80 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
31b90 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
31ba0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
31bb0 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
31bc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
31bd0 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
31be0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
31bf0 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
31c00 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
31c10 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
31c20 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
31c30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
31c40 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
31c50 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
31c60 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
31c70 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
31c80 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
31c90 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
31ca0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
31cb0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
31cc0 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
31cd0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
31ce0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
31cf0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
31d00 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
31d10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
31d20 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
31d30 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
31d40 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
31d50 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
31d60 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
31d70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
31d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31d90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
31db0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
31dc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
31dd0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
31de0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
31df0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
31e00 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
31e10 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
31e20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
31e30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
31e40 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
31e50 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
31e60 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
31e70 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
31e80 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
31e90 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
31ea0 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
31eb0 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
31ec0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
31ed0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
31ee0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
31ef0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
31f00 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
31f10 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
31f20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
31f30 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
31f40 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
31f50 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
31f60 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
31f70 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
31f80 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
31f90 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
31fa0 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
31fb0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
31fc0 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
31fd0 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
31fe0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
31ff0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
32000 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
32010 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
32020 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
32030 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
32040 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
32050 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
32060 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32070 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
32080 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
32090 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
320a0 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
320b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
320c0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
320d0 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
320e0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
320f0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
32100 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
32110 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
32120 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
32130 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
32140 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
32150 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
32160 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32170 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
32180 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
32190 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
321a0 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
321b0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
321c0 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
321d0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
321e0 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
321f0 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
32200 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
32210 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
32220 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
32230 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
32240 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
32250 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
32260 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
32270 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
32280 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
32290 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
322a0 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
322b0 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
322c0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
322d0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
322e0 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
322f0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
32300 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
32310 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
32320 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
32330 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
32340 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32350 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
32360 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
32370 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
32380 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
32390 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
323a0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
323b0 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
323c0 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
323d0 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
323e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
323f0 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
32400 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
32410 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
32420 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
32430 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
32440 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
32450 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
32460 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
32470 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
32480 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
32490 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
324a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
324b0 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
324c0 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
324d0 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
324e0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
324f0 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
32500 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
32510 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
32520 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
32530 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
32540 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
32550 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
32560 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
32570 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
32580 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
32590 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
325a0 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
325b0 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
325c0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
325d0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4f 76     const int nOv
325e0 65 72 72 75 6e 20 3d 20 31 38 3b 20 20 2f 2a 20  errun = 18;  /* 
325f0 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 76 65 72  Size of the over
32600 72 75 6e 20 70 61 64 64 69 6e 67 20 2a 2f 0a 20  run padding */. 
32610 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
32620 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
32630 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
32640 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
32650 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
32660 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
32670 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
32680 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
32690 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
326a0 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
326b0 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
326c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
326d0 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
326e0 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
326f0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
32700 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
32710 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
32720 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
32730 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
32740 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
32750 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32760 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
32770 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
32780 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
32790 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
327a0 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43 65 6c 6c 2f  Cell<2 || nCell/
327b0 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  pCur->pBt->usabl
327c0 65 53 69 7a 65 3e 70 43 75 72 2d 3e 70 42 74 2d  eSize>pCur->pBt-
327d0 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
327e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
327f0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
32800 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32810 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
32820 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
32830 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
32840 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
32850 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 6e 4f 76  alloc( nCell+nOv
32860 65 72 72 75 6e 20 29 3b 0a 20 20 20 20 20 20 20  errun );.       
32870 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
32880 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
32890 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
328a0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
328b0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
328c0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
328d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
328e0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
328f0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72  idx;.          r
32900 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
32910 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
32920 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
32930 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a  *)pCellKey, 0);.
32940 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
32950 28 28 28 75 38 2a 29 70 43 65 6c 6c 4b 65 79 29  (((u8*)pCellKey)
32960 2b 6e 43 65 6c 6c 2c 30 2c 6e 4f 76 65 72 72 75  +nCell,0,nOverru
32970 6e 29 3b 20 2f 2a 20 46 69 78 20 75 6e 69 6e 69  n); /* Fix unini
32980 74 20 77 61 72 6e 69 6e 67 73 20 2a 2f 0a 20 20  t warnings */.  
32990 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
329a0 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
329b0 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
329c0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
329d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
329e0 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
329f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
32a00 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
32a10 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
32a20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
32a30 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
32a40 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
32a50 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
32a60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
32a70 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
32a80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32a90 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20       assert( .  
32aa0 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b            (pIdxK
32ab0 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
32ac0 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63  ITE_CORRUPT || c
32ad0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26  ==0).         &&
32ae0 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
32af0 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  de!=SQLITE_NOMEM
32b00 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65   || pCur->pBtree
32b10 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
32b20 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ed).        );. 
32b30 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29         if( c<0 )
32b40 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
32b50 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
32b60 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29   }else if( c>0 )
32b70 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
32b80 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
32b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32ba0 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29    assert( c==0 )
32bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  ;.          *pRe
32bc0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
32bd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32be0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
32bf0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
32c00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
32c10 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29  dxKey->errCode )
32c20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32c30 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
32c40 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
32c50 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
32c60 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
32c70 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
32c80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32c90 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
32ca0 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
32cb0 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
32cc0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
32cd0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
32ce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
32cf0 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
32d00 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
32d10 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
32d20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
32d30 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
32d40 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
32d50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
32d60 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
32d70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
32d80 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
32d90 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
32da0 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
32db0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32dc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
32dd0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
32de0 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79  .moveto_next_lay
32df0 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e  er:.    if( lwr>
32e00 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
32e10 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
32e20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
32e30 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
32e40 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
32e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
32e60 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
32e70 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
32e80 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
32e90 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
32ea0 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d  )lwr;.    rc = m
32eb0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
32ec0 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
32ed0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
32ee0 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
32ef0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
32f00 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
32f10 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
32f20 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
32f30 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  vfl)==0 );.  ret
32f40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
32f50 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
32f60 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
32f70 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
32f80 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
32f90 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
32fa0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
32fb0 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
32fc0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
32fd0 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
32fe0 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
32ff0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
33000 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
33010 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
33020 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
33030 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
33040 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
33050 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
33060 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33070 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
33080 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
33090 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
330a0 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
330b0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
330c0 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
330d0 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
330e0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
330f0 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
33100 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
33110 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
33120 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
33130 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
33140 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
33150 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
33160 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
33170 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
33180 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74  ** Return an est
33190 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75  imate for the nu
331a0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
331b0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70  the table that p
331c0 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69  Cur is.** pointi
331d0 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61  ng to.  Return a
331e0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
331f0 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20   if no estimate 
33200 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a  is currently .**
33210 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69   available..*/.i
33220 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  64 sqlite3BtreeR
33230 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72  owCountEst(BtCur
33240 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36  sor *pCur){.  i6
33250 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20  4 n;.  u8 i;..  
33260 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
33270 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
33280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
33290 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
332a0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
332b0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
332c0 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69  /* Currently thi
332d0 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f  s interface is o
332e0 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68  nly called by th
332f0 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20  e OP_IfSmaller. 
33300 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20   ** opcode, and 
33310 69 74 20 74 68 61 74 20 63 61 73 65 20 74 68 65  it that case the
33320 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77   cursor will alw
33330 61 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64  ays be valid and
33340 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79  .  ** will alway
33350 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61  s point to a lea
33360 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28  f node. */.  if(
33370 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74   NEVER(pCur->eSt
33380 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
33390 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  D) ) return -1;.
333a0 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
333b0 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ->pPage->leaf==0
333c0 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a  ) ) return -1;..
333d0 20 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50 61 67    n = pCur->pPag
333e0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72 28  e->nCell;.  for(
333f0 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61  i=0; i<pCur->iPa
33400 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20  ge; i++){.    n 
33410 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  *= pCur->apPage[
33420 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20  i]->nCell;.  }. 
33430 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
33440 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
33450 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
33460 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
33470 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52 65  database. .** Re
33480 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a  turn value:.**.*
33490 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20  *    SQLITE_OK  
334a0 20 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a        success.**
334b0 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20      SQLITE_DONE 
334c0 20 20 20 20 20 63 75 72 73 6f 72 20 69 73 20 61       cursor is a
334d0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
334e0 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  at the last elem
334f0 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77  ent.**    otherw
33500 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65 20  ise        some 
33510 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63  kind of error oc
33520 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65  curred.**.** The
33530 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
33540 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
33550 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
33560 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
33570 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
33580 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
33590 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
335a0 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
335b0 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
335c0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
335d0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
335e0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
335f0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
33600 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
33610 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
33620 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
33630 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
33640 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
33650 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
33660 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
33670 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31  *.** If bit 0x01
33680 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65   of the F argume
33690 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  nt in sqlite3Btr
336a0 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20 31  eeNext(C,F) is 1
336b0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75  , then the.** cu
336c0 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  rsor corresponds
336d0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
336e0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
336f0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
33700 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20  n.** skipped if 
33710 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61  the SQL index ha
33720 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20  d been a unique 
33730 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72  index.  The F ar
33740 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20 68  gument.** is a h
33750 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
33760 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62 74  ment.  SQLite bt
33770 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
33780 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  on does not use.
33790 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75  ** this hint, bu
337a0 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a  t COMDB2 does..*
337b0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
337c0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
337d0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
337e0 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
337f0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
33800 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
33810 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
33820 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
33830 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
33840 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
33850 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
33860 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
33870 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
33880 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20  idOvfl)==0 );.  
33890 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
338a0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
338b0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
338c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
338d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
338e0 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
338f0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
33900 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
33910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33920 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  DONE;.    }.    
33930 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
33940 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
33950 54 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  T ){.      pCur-
33960 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
33970 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
33980 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
33990 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >0 ) return SQLI
339a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
339b0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
339c0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 64 78 20 3d  ->pPage;.  idx =
339d0 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 69   ++pCur->ix;.  i
339e0 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
339f0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  t ){.    /* The 
33a00 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79 20 66  only known way f
33a10 6f 72 20 74 68 69 73 20 74 6f 20 68 61 70 70 65  or this to happe
33a20 6e 20 69 73 20 66 6f 72 20 74 68 65 72 65 20 74  n is for there t
33a30 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 72 65  o be a.    ** re
33a40 63 75 72 73 69 76 65 20 53 51 4c 20 66 75 6e 63  cursive SQL func
33a50 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 61  tion that does a
33a60 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
33a70 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 0a 20  n as part of a. 
33a80 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 77 68 69     ** SELECT whi
33a90 63 68 20 64 65 6c 65 74 65 73 20 63 6f 6e 74 65  ch deletes conte
33aa0 6e 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  nt out from unde
33ab0 72 20 61 6e 20 61 63 74 69 76 65 20 63 75 72 73  r an active curs
33ac0 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 63  or.    ** in a c
33ad0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
33ae0 66 69 6c 65 20 77 68 65 72 65 20 74 68 65 20 74  file where the t
33af0 61 62 6c 65 20 62 65 69 6e 67 20 44 45 4c 45 54  able being DELET
33b00 45 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  E-ed from.    **
33b10 20 68 61 73 20 70 61 67 65 73 20 69 6e 20 63 6f   has pages in co
33b20 6d 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 74 61  mmon with the ta
33b30 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
33b40 64 2e 20 20 53 65 65 20 54 48 33 0a 20 20 20 20  d.  See TH3.    
33b50 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31 2f 62  ** module cov1/b
33b60 74 72 65 65 37 38 2e 74 65 73 74 20 74 65 73 74  tree78.test test
33b70 63 61 73 65 20 32 32 30 20 28 32 30 31 38 2d 30  case 220 (2018-0
33b80 36 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20 20 20  6-08) for an.   
33b90 20 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a   ** example. */.
33ba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33bb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33bc0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33bd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
33be0 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
33bf0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
33c00 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
33c10 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
33c20 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
33c30 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
33c40 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
33c50 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
33c60 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
33c70 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
33c80 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
33c90 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
33ca0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
33cb0 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
33cc0 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
33cd0 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
33ce0 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
33cf0 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
33d00 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
33d10 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
33d20 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
33d30 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69  e->nCell );..  i
33d40 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
33d50 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
33d60 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
33d70 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
33d80 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
33d90 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
33da0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
33db0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
33dc0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
33dd0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
33de0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
33df0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
33e00 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
33e10 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
33e20 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
33e30 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
33e40 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
33e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
33e60 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
33e70 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
33e80 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
33e90 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
33ea0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
33eb0 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e  ur->ix>=pPage->n
33ec0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
33ed0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
33ee0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
33ef0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
33f00 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
33f10 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
33f20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
33f30 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
33f40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
33f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
33f70 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
33f80 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
33f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
33fa0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
33fb0 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29  pCur, int flags)
33fc0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
33fd0 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ge;.  UNUSED_PAR
33fe0 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b  AMETER( flags );
33ff0 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d    /* Used in COM
34000 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69  DB2 but not nati
34010 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61  ve SQLite */.  a
34020 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
34030 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
34040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
34050 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
34060 31 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  1 );.  pCur->inf
34070 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
34080 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
34090 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
340a0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
340b0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
340c0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
340d0 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72  LID ) return btr
340e0 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20  eeNext(pCur);.  
340f0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
34100 61 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  age;.  if( (++pC
34110 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e  ur->ix)>=pPage->
34120 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
34130 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74  r->ix--;.    ret
34140 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
34150 75 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ur);.  }.  if( p
34160 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
34170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34180 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
34190 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
341a0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
341b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  }.}../*.** Step 
341c0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
341d0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
341e0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
341f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
34200 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a   Return values:.
34210 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
34220 5f 4f 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a  _OK     success.
34230 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f  **     SQLITE_DO
34240 4e 45 20 20 20 74 68 65 20 63 75 72 73 6f 72 20  NE   the cursor 
34250 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68  is already on th
34260 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
34270 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
34280 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20      otherwise   
34290 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65    some kind of e
342a0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a  rror occurred.**
342b0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
342c0 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
342d0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
342e0 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
342f0 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
34300 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
34310 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
34320 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  decrementing the
34330 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
34340 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
34350 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
34360 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
34370 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
34380 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65  slower) btreePre
34390 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65  vious().** helpe
343a0 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  r routine is cal
343b0 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
343c0 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
343d0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
343e0 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65  page.** or to re
343f0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
34400 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30  ..**.** If bit 0
34410 78 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67  x01 of the F arg
34420 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
34430 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c  BtreePrevious(C,
34440 46 29 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a  F) is 1, then.**
34450 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72   the cursor corr
34460 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
34470 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73  L index and this
34480 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
34490 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70  ave been.** skip
344a0 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69  ped if the SQL i
344b0 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20  ndex had been a 
344c0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54  unique index.  T
344d0 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73  he F argument is
344e0 20 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68   a.** hint to th
344f0 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68  e implement.  Th
34500 65 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20  e native SQLite 
34510 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
34520 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  tion does not.**
34530 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20   use this hint, 
34540 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e  but COMDB2 does.
34550 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
34560 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
34570 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
34580 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
34590 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
345a0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
345b0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
345c0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
345d0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
345e0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
345f0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
34600 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
34610 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a  lidNKey))==0 );.
34620 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
34630 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
34640 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
34650 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
34660 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  D ){.    rc = re
34670 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
34680 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
34690 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
346a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
346b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
346c0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
346d0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
346e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
346f0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
34700 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
34710 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
34720 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
34730 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
34740 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
34750 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
34760 6b 69 70 4e 65 78 74 3c 30 20 29 20 72 65 74 75  kipNext<0 ) retu
34770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
34780 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
34790 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
347a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
347b0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
347c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
347d0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
347e0 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20  Cur->ix;.    rc 
347f0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
34800 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
34810 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
34820 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
34830 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34840 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
34850 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
34860 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
34870 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a   pCur->ix==0 ){.
34880 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
34890 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
348a0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
348b0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
348c0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
348d0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
348e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
348f0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
34900 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
34910 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
34920 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
34930 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
34940 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61  Flags & (BTCF_Va
34950 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a  lidOvfl))==0 );.
34960 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b  .    pCur->ix--;
34970 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
34980 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66  r->pPage;.    if
34990 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
349a0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
349b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
349c0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
349d0 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  us(pCur, 0);.   
349e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
349f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
34a00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
34a10 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
34a20 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
34a30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
34a40 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
34a50 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
34a60 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
34a70 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
34a80 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
34a90 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
34aa0 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b  AMETER( flags );
34ab0 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d    /* Used in COM
34ac0 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69  DB2 but not nati
34ad0 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70  ve SQLite */.  p
34ae0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
34af0 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
34b00 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
34b10 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
34b20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
34b30 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
34b40 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
34b50 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
34b60 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20  ur->ix==0.   || 
34b70 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61  pCur->pPage->lea
34b80 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  f==0.  ){.    re
34b90 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f  turn btreePrevio
34ba0 75 73 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  us(pCur);.  }.  
34bb0 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65  pCur->ix--;.  re
34bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
34be0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
34bf0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
34c00 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
34c10 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
34c20 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
34c30 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
34c40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34c50 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
34c60 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
34c70 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
34c80 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
34c90 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
34ca0 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
34cb0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
34cc0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
34cd0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
34ce0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
34cf0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
34d00 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
34d10 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
34d20 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
34d30 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
34d40 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
34d50 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
34d60 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
34d70 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
34d80 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  LL in the event 
34d90 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  of an error..**.
34da0 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
34db0 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
34dc0 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65  not 0, then an e
34dd0 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
34de0 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
34df0 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
34e00 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
34e10 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
34e20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
34e30 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
34e40 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
34e50 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
34e60 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
34e70 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
34e80 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
34e90 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
34ea0 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
34eb0 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61   If the eMode pa
34ec0 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c  rameter is BTALL
34ed0 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65  OC_EXACT and the
34ee0 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69   nearby page exi
34ef0 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  sts.** anywhere 
34f00 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
34f10 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
34f20 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  ranteed to be re
34f30 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65  turned.  If.** e
34f40 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f  Mode is BTALLOC_
34f50 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  LT then the page
34f60 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
34f70 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  e less than or e
34f80 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62  qual.** to nearb
34f90 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61  y if any such pa
34fa0 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65  ge exists.  If e
34fb0 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f  Mode is BTALLOC_
34fc0 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a  ANY then there.*
34fd0 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63  * are no restric
34fe0 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70  tions on which p
34ff0 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  age is returned.
35000 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
35010 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
35020 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
35030 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  t,         /* Th
35040 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  e btree */.  Mem
35050 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
35060 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69      /* Store poi
35070 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f  nter to the allo
35080 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20  cated page here 
35090 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
350a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
350b0 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75  tore the page nu
350c0 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50  mber here */.  P
350d0 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20  gno nearby,     
350e0 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
350f0 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20  for a page near 
35100 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38  this one */.  u8
35110 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20   eMode          
35120 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f       /* BTALLOC_
35130 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c  EXACT, BTALLOC_L
35140 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e  T, or BTALLOC_AN
35150 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  Y */.){.  MemPag
35160 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
35170 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20   rc;.  u32 n;   
35180 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
35190 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
351a0 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b  list */.  u32 k;
351b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
351c0 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
351d0 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
351e0 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
351f0 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
35200 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
35210 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e  Trunk = 0;.  Pgn
35220 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a  o mxPage;     /*
35230 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
35240 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35250 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
35260 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35270 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
35280 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
35290 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c  ==BTALLOC_ANY ||
352a0 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 52 45   (nearby>0 && RE
352b0 51 55 49 52 45 5f 50 54 52 4d 41 50 20 29 20 29  QUIRE_PTRMAP ) )
352c0 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ;.  pPage1 = pBt
352d0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61  ->pPage1;.  mxPa
352e0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ge = btreePageco
352f0 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45  unt(pBt);.  /* E
35300 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35  VIDENCE-OF: R-05
35310 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d  119-02637 The 4-
35320 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
35330 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
35340 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73  t 36.  ** stores
35350 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61   stores the tota
35360 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
35370 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
35380 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34  t. */.  n = get4
35390 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
353a0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74  ata[36]);.  test
353b0 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d  case( n==mxPage-
353c0 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78  1 );.  if( n>=mx
353d0 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
353e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
353f0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
35400 2a 20 45 6e 73 75 72 65 20 70 61 67 65 20 31 20  * Ensure page 1 
35410 69 73 20 77 72 69 74 61 62 6c 65 2e 20 54 68 69  is writable. Thi
35420 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
35430 65 69 74 68 65 72 20 63 68 61 6e 67 65 20 74 68  either change th
35440 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
35450 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 72   pages in the fr
35460 65 65 2d 6c 69 73 74 20 6f 72 20 74 68 65 20 73  ee-list or the s
35470 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
35480 61 73 65 20 66 69 6c 65 2e 20 53 69 6e 63 65 20  ase file. Since 
35490 62 6f 74 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  both.  ** of the
354a0 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e  se operations in
354b0 76 6f 6c 76 65 20 6d 6f 64 69 66 79 69 6e 67 20  volve modifying 
354c0 70 61 67 65 20 31 20 68 65 61 64 65 72 20 66 69  page 1 header fi
354d0 65 6c 64 73 2c 20 70 61 67 65 20 31 0a 20 20 2a  elds, page 1.  *
354e0 2a 20 77 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c  * will definitel
354f0 79 20 62 65 20 77 72 69 74 74 65 6e 20 62 79 20  y be written by 
35500 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
35510 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
35520 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20  CONCURRENT.  ** 
35530 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73  transaction, ens
35540 75 72 65 20 74 68 65 20 42 74 72 65 65 50 74 72  ure the BtreePtr
35550 6d 61 70 20 73 74 72 75 63 74 75 72 65 20 68 61  map structure ha
35560 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
35570 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
35580 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35590 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
355a0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
355b0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e  rn rc;..  if( n>
355c0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
355d0 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
355e0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
355f0 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
35600 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
35610 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
35620 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
35630 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
35640 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
35650 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
35660 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
35670 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
35680 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
35690 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
356a0 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
356b0 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
356c0 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
356d0 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
356e0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
356f0 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
35700 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
35710 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
35720 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
35730 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
35740 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
35750 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
35760 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
35770 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f    */.    if( eMo
35780 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
35790 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
357a0 74 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 21  t( ISAUTOVACUUM!
357b0 3d 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b  =ISCONCURRENT );
357c0 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
357d0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
357e0 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
357f0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
35800 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
35810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
35820 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
35830 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
35840 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
35850 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
35860 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
35870 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
35880 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35890 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
358a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 54            if( eT
358b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
358c0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
358d0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
358e0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
358f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
35910 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
35920 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35930 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
35940 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
35950 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
35960 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
35970 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
35980 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
35990 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
359a0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
359b0 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
359c0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
359d0 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
359e0 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
359f0 20 20 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79     */.    put4by
35a00 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
35a10 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
35a20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
35a30 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
35a40 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
35a50 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
35a60 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
35a70 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
35a80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
35a90 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
35aa0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
35ab0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
35ac0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
35ad0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
35ae0 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
35af0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
35b00 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
35b10 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
35b20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
35b30 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
35b40 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
35b50 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
35b60 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
35b70 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
35b80 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
35b90 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
35ba0 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
35bb0 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
35bc0 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
35bd0 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
35be0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
35bf0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
35c00 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
35c10 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
35c20 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
35c30 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
35c40 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
35c50 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
35c60 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
35c70 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
35c80 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
35c90 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
35ca0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
35cb0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
35cc0 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
35cd0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
35ce0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
35cf0 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
35d00 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
35d10 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
35d20 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
35d30 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
35d40 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
35d50 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
35d60 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
35d70 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
35d80 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
35d90 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
35da0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
35db0 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
35dc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
35dd0 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
35de0 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
35df0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35e00 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
35e10 70 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72  pPrevTrunk ? pPr
35e20 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20  evTrunk->pgno : 
35e30 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
35e40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
35e50 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
35e60 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
35e70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
35e80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
35e90 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
35ea0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
35eb0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
35ec0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
35ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
35ee0 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
35ef0 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
35f00 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20  aData!=0 );.    
35f10 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
35f20 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20  : R-13523-04394 
35f30 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
35f40 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
35f50 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
35f60 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62    ** is the numb
35f70 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20  er of leaf page 
35f80 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c  pointers to foll
35f90 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d  ow. */.      k =
35fa0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
35fb0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
35fc0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
35fd0 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
35fe0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
35ff0 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
36000 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
36010 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
36020 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
36030 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
36040 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
36050 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
36060 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
36070 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
36080 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
36090 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
360a0 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
360b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
360c0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
360d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
360e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
360f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
36100 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
36110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36120 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
36130 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
36140 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
36150 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
36160 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
36170 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
36180 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
36190 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
361a0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
361b0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
361c0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
361d0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
361e0 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
361f0 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
36200 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
36210 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
36220 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
36230 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
36240 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
36250 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
36260 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
36270 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
36280 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
36290 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
362a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
362b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
362c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
362d0 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
362e0 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
362f0 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
36300 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
36310 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
36320 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
36330 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
36340 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
36350 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
36360 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
36370 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
36380 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
36390 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
363a0 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
363b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
363c0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
363d0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
363e0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
363f0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
36400 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
36410 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36420 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
36430 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
36440 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
36450 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
36460 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
36470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
36480 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
36490 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
364a0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
364b0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
364c0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
364d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
364e0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
364f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
36500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36510 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
36520 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
36530 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
36540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36550 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
36560 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
36570 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
36580 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
36590 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
365a0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
365b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
365c0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
365d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
365e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
365f0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
36600 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
36610 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
36620 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
36630 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
36640 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
36650 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
36660 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
36670 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
36680 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
36690 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
366a0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
366b0 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
366c0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
366d0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
366e0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
366f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
36700 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
36710 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
36720 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
36730 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e  RRUPT_PGNO(iTrun
36740 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
36750 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
36760 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
36770 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
36780 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
36790 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
367a0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
367b0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
367c0 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
367d0 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
367e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
367f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36800 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
36810 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
36820 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
36830 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
36840 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36850 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
36860 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
36870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
36890 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
368a0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
368b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
368c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
368d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
368e0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
368f0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
36900 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
36910 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
36920 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
36930 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
36940 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
36950 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
36960 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
36970 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
36980 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
36990 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
369a0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
369b0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
369c0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
369d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
369e0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
369f0 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
36a00 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
36a10 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
36a20 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
36a30 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
36a40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
36a50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
36a60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36a70 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
36a80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
36a90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
36aa0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
36ab0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
36ac0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
36ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
36ae0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
36af0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
36b00 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
36b10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
36b20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
36b30 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
36b40 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
36b50 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
36b60 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
36b70 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
36b80 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
36b90 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
36ba0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
36bb0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
36bc0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
36bd0 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
36be0 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
36bf0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
36c00 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
36c10 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
36c20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
36c30 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
36c40 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
36c50 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
36c60 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f           if( eMo
36c70 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
36c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
36c90 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
36ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
36cb0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
36cc0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  (&aData[8+i*4]);
36cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
36ce0 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79  f( iPage<=nearby
36cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36d00 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
36d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
36d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36d40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
36d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
36d60 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
36d70 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
36d80 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
36d90 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
36da0 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  8]) - nearby);. 
36db0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
36dc0 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
36dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
36de0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73   d2 = sqlite3Abs
36df0 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
36e00 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
36e10 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
36e20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
36e30 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
36e40 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
36e50 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
36e60 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
36e70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
36e80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
36eb0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
36ec0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
36ed0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
36ee0 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
36ef0 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
36f00 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
36f10 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
36f20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
36f30 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
36f40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
36f50 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
36f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
36f70 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
36f80 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
36f90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
36fa0 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
36fb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
36fc0 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
36fd0 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e      || (iPage==n
36fe0 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c  earby || (iPage<
36ff0 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
37000 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
37010 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
37020 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
37030 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
37040 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
37050 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
37060 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
37070 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
37080 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
37090 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
370a0 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
370b0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
370c0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
370d0 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
370e0 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
370f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
37100 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
37110 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
37120 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
37130 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
37140 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
37150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
37160 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
37170 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
37180 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
37190 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
371a0 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
371b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
371c0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
371d0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
371e0 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
371f0 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
37200 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20  t(pBt, *pPgno)? 
37210 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
37220 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
37230 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
37240 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
37250 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
37260 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
37270 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37290 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
372a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
372b0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
372c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
372d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
372e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
372f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
37300 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
37310 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
37320 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
37330 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37340 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
37350 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
37360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
37370 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
37380 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
37390 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
373a0 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
373b0 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
373c0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
373d0 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
373e0 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61  e freelist, so a
373f0 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65  ppend a new page
37400 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
37410 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
37420 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72     **.    ** Nor
37430 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73  mally, new pages
37440 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
37450 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20  is block can be 
37460 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
37470 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
37480 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
37490 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
374a0 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65   set. This preve
374b0 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  nts the pager.  
374c0 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
374d0 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
374e0 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  es content from 
374f0 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  disk. However, i
37500 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  f the.    ** cur
37510 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
37520 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
37530 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63   one or more inc
37540 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a  remental-vacuum.
37550 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68      ** steps, th
37560 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61  en the page we a
37570 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f  re about to allo
37580 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cate may contain
37590 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20   content.    ** 
375a0 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
375b0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
375c0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20   a rollback. In 
375d0 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20  this case, do.  
375e0 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65    ** not set the
375f0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67   no-content flag
37600 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
37610 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20  e pager to load 
37620 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  and journal.    
37630 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ** the current p
37640 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  age content befo
37650 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69  re overwriting i
37660 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
37670 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
37680 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63  ager will not ac
37690 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74  tually attempt t
376a0 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61  o load or journa
376b0 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  l .    ** conten
376c0 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74  t for any page t
376d0 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  hat really does 
376e0 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  lie past the end
376f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
37700 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20  .    ** file on 
37710 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66  disk. So the eff
37720 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e  ects of disablin
37730 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  g the no-content
37740 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
37750 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f    ** here are co
37760 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20  nfined to those 
37770 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
37780 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
37790 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  f the.    ** dat
377a0 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20  abase image and 
377b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
377c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
377d0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f    */.    int bNo
377e0 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66  Content = (0==If
377f0 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
37800 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41  DoTruncate))? PA
37810 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
37820 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  T:0;..    rc = s
37830 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
37840 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
37850 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
37860 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
37870 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
37880 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
37890 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
378a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
378b0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
378c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
378d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
378e0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
378f0 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
37900 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
37910 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
37920 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
37930 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
37940 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
37950 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
37960 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
37970 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
37980 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
37990 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
379a0 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
379b0 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
379c0 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
379d0 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
379e0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
379f0 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
37a00 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
37a10 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
37a20 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
37a30 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
37a40 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
37a50 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
37a60 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
37a70 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
37a80 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
37a90 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
37aa0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
37ab0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
37ac0 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
37ad0 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
37ae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37af0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37b00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37b10 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
37b20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
37b30 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
37b40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37b50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37b60 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
37b70 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
37b80 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
37b90 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
37ba0 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
37bb0 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
37bc0 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
37bd0 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
37be0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
37bf0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
37c00 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
37c10 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
37c20 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
37c30 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
37c40 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
37c50 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
37c60 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
37c70 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
37c80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
37c90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
37ca0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37cb0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
37cc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
37cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37ce0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
37cf0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
37d00 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
37d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
37d20 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
37d30 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
37d40 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
37d50 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 43    }..  assert( C
37d60 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 2a 70 50  ORRUPT_DB || *pP
37d70 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
37d80 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
37d90 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
37da0 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
37db0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
37dc0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
37dd0 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  nk);.  assert( r
37de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
37df0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
37e00 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
37e10 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20  e)->pDbPage)<=1 
37e20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
37e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a  =SQLITE_OK || (*
37e40 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
37e50 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
37e60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
37e70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
37e80 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
37e90 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
37ea0 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
37eb0 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
37ec0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
37ed0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
37ee0 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
37ef0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
37f00 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
37f10 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
37f20 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
37f30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
37f40 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
37f50 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
37f60 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
37f70 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
37f80 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
37f90 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
37fa0 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
37fb0 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
37fc0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
37fd0 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
37fe0 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
37ff0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
38000 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
38010 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
38020 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
38030 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
38040 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
38050 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
38060 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
38070 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
38080 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
38090 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
380a0 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
380b0 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
380c0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
380d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
380e0 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
380f0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
38100 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
38110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38120 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
38130 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
38140 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
38150 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
38160 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
38170 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
38180 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
38190 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
381a0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
381b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
381c0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
381d0 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
381e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
381f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38200 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
38210 43 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6e 46  Code */.  u32 nF
38220 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
38230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38240 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
38250 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
38260 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
38270 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
38280 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
38290 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
382a0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50  CORRUPT_DB || iP
382b0 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
382c0 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
382d0 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
382e0 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
382f0 69 50 61 67 65 3c 32 20 7c 7c 20 69 50 61 67 65  iPage<2 || iPage
38300 3e 70 42 74 2d 3e 6e 50 61 67 65 20 29 7b 0a 20  >pBt->nPage ){. 
38310 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
38320 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
38330 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67   }.  if( pMemPag
38340 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
38350 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
38360 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
38370 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
38380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
38390 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
383a0 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
383b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
383c0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
383d0 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
383e0 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
383f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
38400 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
38410 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
38420 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
38430 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
38440 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
38450 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
38460 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
38470 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
38480 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
38490 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
384a0 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
384b0 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63