/ Hex Artifact Content
Login

Artifact b8ffd067e78704a8bf81b83c60a23987a46dac9aca0c08c3959482dfae02d197:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
3a80: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
3a90: 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  ENT./*.** The fo
3aa0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3ab0: 65 20 2d 20 42 74 72 65 65 50 74 72 6d 61 70 20  e - BtreePtrmap 
3ac0: 2d 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 2d  - stores the in-
3ad0: 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 6d  memory pointer m
3ae0: 61 70 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 6e  ap.** used for n
3af0: 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
3b00: 61 67 65 73 20 69 6e 20 43 4f 4e 43 55 52 52 45  ages in CONCURRE
3b10: 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  NT transactions.
3b20: 20 53 75 63 68 20 70 61 67 65 73 20 61 72 65 0a   Such pages are.
3b30: 2a 2a 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ** always alloca
3b40: 74 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  ted in a contigu
3b50: 6f 75 73 20 62 6c 6f 63 6b 20 28 66 72 6f 6d 20  ous block (from 
3b60: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
3b70: 69 6c 65 29 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile) starting.**
3b80: 20 77 69 74 68 20 70 61 67 65 20 42 74 72 65 65   with page Btree
3b90: 50 74 72 6d 61 70 2e 69 46 69 72 73 74 2e 0a 2a  Ptrmap.iFirst..*
3ba0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
3bb0: 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 52   RollbackEntry R
3bc0: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 3b 0a 74 79  ollbackEntry;.ty
3bd0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 74 72  pedef struct Ptr
3be0: 6d 61 70 45 6e 74 72 79 20 50 74 72 6d 61 70 45  mapEntry PtrmapE
3bf0: 6e 74 72 79 3b 0a 73 74 72 75 63 74 20 50 74 72  ntry;.struct Ptr
3c00: 6d 61 70 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e  mapEntry {.  Pgn
3c10: 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75 38 20 65  o parent;.  u8 e
3c20: 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75 63 74 20  Type;.};.struct 
3c30: 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 7b 0a  RollbackEntry {.
3c40: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 50    Pgno pgno;.  P
3c50: 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75 38  gno parent;.  u8
3c60: 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75 63   eType;.};.struc
3c70: 74 20 42 74 72 65 65 50 74 72 6d 61 70 20 7b 0a  t BtreePtrmap {.
3c80: 20 20 50 67 6e 6f 20 69 46 69 72 73 74 3b 20 20    Pgno iFirst;  
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 2f 2a 20 46 69 72 73 74 20 6e 65 77 20 70    /* First new p
3cb0: 61 67 65 20 6e 75 6d 62 65 72 20 61 50 74 72 5b  age number aPtr[
3cc0: 30 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 74  0] */..  int nPt
3cd0: 72 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  rAlloc;         
3ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3cf0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 50  cated size of aP
3d00: 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  tr[] array */.  
3d10: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 61 50 74  PtrmapEntry *aPt
3d20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3d30: 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 61 72 65  /* Array of pare
3d40: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  nt page numbers 
3d50: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 76 70 74 3b  */..  int nSvpt;
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69        /* Used si
3d80: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 61 72  ze of aSvpt[] ar
3d90: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 76  ray */.  int nSv
3da0: 70 74 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  ptAlloc;        
3db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3dc0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 53  cated size of aS
3dd0: 76 70 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 2a  vpt[] */.  int *
3de0: 61 53 76 70 74 3b 20 20 20 20 20 20 20 20 20 20  aSvpt;          
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3e00: 72 73 74 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20  rst aRollback[] 
3e10: 65 6e 74 72 79 20 66 6f 72 20 73 61 76 65 70 6f  entry for savepo
3e20: 69 6e 74 20 69 20 2a 2f 0a 0a 20 20 69 6e 74 20  int i */..  int 
3e30: 6e 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  nRollback;      
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3e50: 73 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 6c  sed size of aRol
3e60: 6c 62 61 63 6b 5b 5d 20 61 72 72 61 79 20 2a 2f  lback[] array */
3e70: 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b  .  int nRollback
3e80: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
3e90: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3ea0: 73 69 7a 65 20 6f 66 20 61 52 6f 6c 6c 62 61 63  size of aRollbac
3eb0: 6b 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 52  k[] array */.  R
3ec0: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 52  ollbackEntry *aR
3ed0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 2f  ollback;       /
3ee0: 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6c 6c 62  * Array of rollb
3ef0: 61 63 6b 20 65 6e 74 72 69 65 73 20 2a 2f 0a 7d  ack entries */.}
3f00: 3b 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  ;../* !defined(S
3f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
3f20: 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 49 66 20  RRENT).**.** If 
3f30: 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
3f40: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
3f50: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 42 74 72   or equal to Btr
3f60: 65 65 50 74 72 6d 61 70 2e 69 46 69 72 73 74 2c  eePtrmap.iFirst,
3f70: 20 0a 2a 2a 20 73 74 6f 72 65 20 61 6e 20 65 6e   .** store an en
3f80: 74 72 79 20 66 6f 72 20 69 74 20 69 6e 20 74 68  try for it in th
3f90: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 74  e pointer-map st
3fa0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
3fb0: 69 63 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d  ic int btreePtrm
3fc0: 61 70 53 74 6f 72 65 28 0a 20 20 42 74 53 68 61  apStore(.  BtSha
3fd0: 72 65 64 20 2a 70 42 74 2c 0a 20 20 50 67 6e 6f  red *pBt,.  Pgno
3fe0: 20 70 67 6e 6f 2c 0a 20 20 75 38 20 65 54 79 70   pgno,.  u8 eTyp
3ff0: 65 2c 20 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e  e, .  Pgno paren
4000: 74 0a 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d  t.){.  BtreePtrm
4010: 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
4020: 70 4d 61 70 3b 0a 20 20 69 66 28 20 70 67 6e 6f  pMap;.  if( pgno
4030: 3e 3d 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 29  >=pMap->iFirst )
4040: 7b 0a 20 20 20 20 69 6e 74 20 69 45 6e 74 72 79  {.    int iEntry
4050: 20 3d 20 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e   = pgno - pMap->
4060: 69 46 69 72 73 74 3b 0a 0a 20 20 20 20 2f 2a 20  iFirst;..    /* 
4070: 47 72 6f 77 20 74 68 65 20 61 50 74 72 5b 5d 20  Grow the aPtr[] 
4080: 61 72 72 61 79 20 61 73 20 72 65 71 75 69 72 65  array as require
4090: 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  d */.    while( 
40a0: 69 45 6e 74 72 79 3e 3d 70 4d 61 70 2d 3e 6e 50  iEntry>=pMap->nP
40b0: 74 72 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  trAlloc ){.     
40c0: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70   int nNew = pMap
40d0: 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3f 20 70 4d  ->nPtrAlloc ? pM
40e0: 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 2a 32 20  ap->nPtrAlloc*2 
40f0: 3a 20 31 36 3b 0a 20 20 20 20 20 20 50 74 72 6d  : 16;.      Ptrm
4100: 61 70 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20  apEntry *aNew = 
4110: 28 50 74 72 6d 61 70 45 6e 74 72 79 2a 29 73 71  (PtrmapEntry*)sq
4120: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
4130: 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61           pMap->a
4140: 50 74 72 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66  Ptr, nNew*sizeof
4150: 28 50 74 72 6d 61 70 45 6e 74 72 79 29 0a 20 20  (PtrmapEntry).  
4160: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
4170: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
4180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4190: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
41a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
41b0: 74 20 6e 42 79 74 65 20 3d 20 28 6e 4e 65 77 2d  t nByte = (nNew-
41c0: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 29  pMap->nPtrAlloc)
41d0: 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45 6e  *sizeof(PtrmapEn
41e0: 74 72 79 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  try);.        me
41f0: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4d 61 70 2d  mset(&aNew[pMap-
4200: 3e 6e 50 74 72 41 6c 6c 6f 63 5d 2c 20 30 2c 20  >nPtrAlloc], 0, 
4210: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
4220: 70 4d 61 70 2d 3e 61 50 74 72 20 3d 20 61 4e 65  pMap->aPtr = aNe
4230: 77 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d  w;.        pMap-
4240: 3e 6e 50 74 72 41 6c 6c 6f 63 20 3d 20 6e 4e 65  >nPtrAlloc = nNe
4250: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
4260: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
4270: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 72 6f 6c  entry to the rol
4280: 6c 62 61 63 6b 20 6c 6f 67 20 69 66 20 72 65 71  lback log if req
4290: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  uired */.    if(
42a0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 3e 30 20 26   pMap->nSvpt>0 &
42b0: 26 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e  & pMap->aPtr[iEn
42c0: 74 72 79 5d 2e 70 61 72 65 6e 74 20 29 7b 0a 20  try].parent ){. 
42d0: 20 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e       if( pMap->n
42e0: 52 6f 6c 6c 62 61 63 6b 3e 3d 70 4d 61 70 2d 3e  Rollback>=pMap->
42f0: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 29  nRollbackAlloc )
4300: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e  {.        int nN
4310: 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c  ew = pMap->nRoll
4320: 62 61 63 6b 20 3f 20 70 4d 61 70 2d 3e 6e 52 6f  back ? pMap->nRo
4330: 6c 6c 62 61 63 6b 2a 32 20 3a 20 31 36 3b 0a 20  llback*2 : 16;. 
4340: 20 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45         RollbackE
4350: 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20 28 52 6f  ntry *aNew = (Ro
4360: 6c 6c 62 61 63 6b 45 6e 74 72 79 2a 29 73 71 6c  llbackEntry*)sql
4370: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
4380: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4390: 61 52 6f 6c 6c 62 61 63 6b 2c 20 6e 4e 65 77 2a  aRollback, nNew*
43a0: 73 69 7a 65 6f 66 28 52 6f 6c 6c 62 61 63 6b 45  sizeof(RollbackE
43b0: 6e 74 72 79 29 0a 20 20 20 20 20 20 20 20 29 3b  ntry).        );
43c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
43d0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
43e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
43f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
4400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4410: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 20  pMap->aRollback 
4420: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
4430: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4440: 6b 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  kAlloc = nNew;. 
4450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4460: 0a 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52  ..      pMap->aR
4470: 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52  ollback[pMap->nR
4480: 6f 6c 6c 62 61 63 6b 5d 2e 70 67 6e 6f 20 3d 20  ollback].pgno = 
4490: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 4d 61 70  pgno;.      pMap
44a0: 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70  ->aRollback[pMap
44b0: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 61 72  ->nRollback].par
44c0: 65 6e 74 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72  ent = pMap->aPtr
44d0: 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 3b  [iEntry].parent;
44e0: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f  .      pMap->aRo
44f0: 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f  llback[pMap->nRo
4500: 6c 6c 62 61 63 6b 5d 2e 65 54 79 70 65 20 3d 20  llback].eType = 
4510: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4520: 79 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 7d 0a  y].eType;.    }.
4530: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
4540: 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20  he aPtr[] array 
4550: 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50 74  */.    pMap->aPt
4560: 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74  r[iEntry].parent
4570: 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 70   = parent;.    p
4580: 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79  Map->aPtr[iEntry
4590: 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b  ].eType = eType;
45a0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
45b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
45c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
45d0: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29  OMIT_CONCURRENT)
45e0: 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76 65  .**.** Open save
45f0: 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  point iSavepoint
4600: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4610: 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f 0a  lready open..*/.
4620: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4630: 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53 68  PtrmapBegin(BtSh
4640: 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 6e  ared *pBt, int n
4650: 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50 74  Svpt){.  BtreePt
4660: 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74  rmap *pMap = pBt
4670: 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d  ->pMap;.  if( pM
4680: 61 70 20 26 26 20 6e 53 76 70 74 3c 70 4d 61 70  ap && nSvpt<pMap
4690: 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20 69  ->nSvpt ){.    i
46a0: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 53  nt i;.    if( nS
46b0: 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70 74  vpt>=pMap->nSvpt
46c0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
46d0: 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d 3e  nt nNew = pMap->
46e0: 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d 61  nSvptAlloc ? pMa
46f0: 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32 20  p->nSvptAlloc*2 
4700: 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74 20  : 16;.      int 
4710: 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  *aNew = sqlite3_
4720: 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61 53  realloc(pMap->aS
4730: 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  vpt, sizeof(int)
4740: 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20   * nNew);.      
4750: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
4760: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
4770: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
4780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4790: 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20 61   pMap->aSvpt = a
47a0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d 61  New;.        pMa
47b0: 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d 20  p->nSvptAlloc = 
47c0: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nNew;.      }.  
47d0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 70    }..    for(i=p
47e0: 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e 53  Map->nSvpt; i<nS
47f0: 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vpt; i++){.     
4800: 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d 20   pMap->aSvpt[i] 
4810: 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  = pMap->nRollbac
4820: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 61  k;.    }.    pMa
4830: 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70 74  p->nSvpt = nSvpt
4840: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4850: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4860: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4870: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
4880: 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ).**.** Rollback
4890: 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f 49   (if op==SAVEPOI
48a0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72 20  NT_ROLLBACK) or 
48b0: 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d 3d  release (if op==
48c0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
48d0: 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  E).** savepoint 
48e0: 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  iSvpt..*/.static
48f0: 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d 61   void btreePtrma
4900: 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a 70  pEnd(BtShared *p
4910: 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  Bt, int op, int 
4920: 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  iSvpt){.  BtreeP
4930: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4940: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4950: 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Map ){.    asser
4960: 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
4970: 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70 3d  _ROLLBACK || op=
4980: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4990: 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  SE );.    assert
49a0: 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28 69  ( iSvpt>=0 || (i
49b0: 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  Svpt==-1 && op==
49c0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
49d0: 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 69  CK) );.    if( i
49e0: 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Svpt<0 ){.      
49f0: 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30 3b  pMap->nSvpt = 0;
4a00: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f  .      pMap->nRo
4a10: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
4a20: 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e 61    memset(pMap->a
4a30: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Ptr, 0, sizeof(P
4a40: 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50 74  gno) * pMap->nPt
4a50: 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65 6c  rAlloc);.    }el
4a60: 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d 61  se if( iSvpt<pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
4a90: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
4aa0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
4ab0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 70          for(ii=p
4ac0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d 31  Map->nRollback-1
4ad0: 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76 70  ; ii>=pMap->aSvp
4ae0: 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29 7b  t[iSvpt]; ii--){
4af0: 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c 62  .          Rollb
4b00: 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26 70  ackEntry *p = &p
4b10: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 69  Map->aRollback[i
4b20: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50 74  i];.          Pt
4b30: 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72  rmapEntry *pEntr
4b40: 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b  y = &pMap->aPtr[
4b50: 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e  p->pgno - pMap->
4b60: 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 20  iFirst];.       
4b70: 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e     pEntry->paren
4b80: 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a 20  t = p->parent;. 
4b90: 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 2d           pEntry-
4ba0: 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70  >eType = p->eTyp
4bb0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
4bc0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70 2d     }.      pMap-
4bd0: 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20 2b  >nSvpt = iSvpt +
4be0: 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
4bf0: 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
4c00: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
4c10: 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69   = pMap->aSvpt[i
4c20: 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Svpt];.    }.  }
4c30: 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28  .}../* !defined(
4c40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
4c50: 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68  URRENT).**.** Th
4c60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4c70: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 43  alled after an C
4c80: 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61  ONCURRENT transa
4c90: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20  ction is opened 
4ca0: 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
4cb0: 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65 73  se. It allocates
4cc0: 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61 70   the BtreePtrmap
4cd0: 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64 20   structure used 
4ce0: 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65 72  to track pointer
4cf0: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  s.** to allocate
4d00: 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72 6f  d pages and zero
4d10: 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54 72  es the nFree/iTr
4d20: 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74 68  unk fields in th
4d30: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
4d40: 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31 2e  eader on page 1.
4d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4d60: 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61  treePtrmapAlloca
4d70: 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  te(BtShared *pBt
4d80: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4d90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
4da0: 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a 20  Bt->pMap==0 ){. 
4db0: 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a     BtreePtrmap *
4dc0: 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMap = sqlite3_m
4dd0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74 72  alloc(sizeof(Btr
4de0: 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20 20  eePtrmap));.    
4df0: 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a 20  if( pMap==0 ){. 
4e00: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4e10: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
4e20: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
4e30: 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
4e40: 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a 65  ata[32], 0, size
4e50: 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20 20  of(u32)*2);.    
4e60: 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20 30    memset(pMap, 0
4e70: 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50 74  , sizeof(BtreePt
4e80: 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70 4d  rmap));.      pM
4e90: 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42 74  ap->iFirst = pBt
4ea0: 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20 20  ->nPage + 1;.   
4eb0: 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20 70     pBt->pMap = p
4ec0: 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Map;.    }.  }. 
4ed0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4ee0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4ef0: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4f00: 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  T).**.** Free an
4f10: 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74  y BtreePtrmap st
4f20: 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65  ructure allocate
4f30: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
4f40: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65 65  call to.** btree
4f50: 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 29  PtrmapAllocate()
4f60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4f70: 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65   btreePtrmapDele
4f80: 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  te(BtShared *pBt
4f90: 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70  ){.  BtreePtrmap
4fa0: 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d   *pMap = pBt->pM
4fb0: 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 29  ap;.  if( pMap )
4fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
4fd0: 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61  ee(pMap->aRollba
4fe0: 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ck);.    sqlite3
4ff0: 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74 72  _free(pMap->aPtr
5000: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5010: 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74 29  ree(pMap->aSvpt)
5020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
5030: 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70 42  ee(pMap);.    pB
5040: 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20 7d  t->pMap = 0;.  }
5050: 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 53 51 4c  .}.#else  /* SQL
5060: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
5070: 45 4e 54 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  ENT */.# define 
5080: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5090: 61 74 65 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b  ate(x) SQLITE_OK
50a0: 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50  .# define btreeP
50b0: 74 72 6d 61 70 44 65 6c 65 74 65 28 78 29 20 0a  trmapDelete(x) .
50c0: 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74  # define btreePt
50d0: 72 6d 61 70 42 65 67 69 6e 28 78 2c 79 29 20 20  rmapBegin(x,y)  
50e0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
50f0: 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e  ne btreePtrmapEn
5100: 64 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  d(x,y,z) .#endif
5110: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5120: 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 73  CONCURRENT */..s
5130: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
5140: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
5150: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
5160: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5170: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
5180: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
5190: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
51a0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
51b0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
51c0: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
51d0: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
51e0: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
51f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
5200: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
5210: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
5220: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
5230: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
5240: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
5250: 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72  utex);.}../* Ver
5260: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72  ify that the cur
5270: 73 6f 72 20 61 6e 64 20 74 68 65 20 42 74 53 68  sor and the BtSh
5280: 61 72 65 64 20 61 67 72 65 65 20 61 62 6f 75 74  ared agree about
5290: 20 77 68 61 74 20 69 73 20 74 68 65 20 63 75 72   what is the cur
52a0: 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65  rent.** database
52b0: 20 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73   connetion. This
52c0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e   is important in
52d0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
52e0: 64 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62  de. If the datab
52f0: 61 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ase .** connecti
5300: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 67 65 74 20  on pointers get 
5310: 6f 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20  out-of-sync, it 
5320: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
5330: 72 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a  routines like.**
5340: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
5350: 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
5360: 20 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f   stale connectio
5370: 6e 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 72  n pointer that r
5380: 65 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61  eferences a.** a
5390: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74   connection that
53a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 63 6c 6f   has already clo
53b0: 73 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  sed.  This routi
53c0: 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  ne is used insid
53d0: 65 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  e assert().** st
53e0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e  atements only an
53f0: 64 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  d for the purpos
5400: 65 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65 63  e of double-chec
5410: 6b 69 6e 67 20 74 68 61 74 20 74 68 65 20 62 74  king that the bt
5420: 72 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73  ree code.** does
5430: 20 6b 65 65 70 20 74 68 65 20 64 61 74 61 62 61   keep the databa
5440: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f  se connection po
5450: 69 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64 61 74  inters up-to-dat
5460: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5470: 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
5480: 72 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29  red(BtCursor *p)
5490: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
54a0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  orHoldsMutex(p) 
54b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
54c0: 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70  pBtree->db==p->p
54d0: 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69  Bt->db);.}.#endi
54e0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  f../*.** Invalid
54f0: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
5500: 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75   cache of the cu
5510: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
5520: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5530: 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  t..** on the sha
5540: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
5550: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66  ure pBt..*/.#def
5560: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
5570: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
5580: 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ) (pCur->curFlag
5590: 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64  s &= ~BTCF_Valid
55a0: 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  Ovfl)../*.** Inv
55b0: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
55c0: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
55d0: 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72  ache for all cur
55e0: 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  sors opened.** o
55f0: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
5600: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
5610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5620: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
5630: 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68  erflowCache(BtSh
5640: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
5650: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5660: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5670: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5680: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
5690: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
56a0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
56b0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
56c0: 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d  lowCache(p);.  }
56d0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
56e0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
56f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
5700: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
5710: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
5720: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
5730: 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e  a table.** to in
5740: 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
5750: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68  rblob cursors th
5760: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74  at are open on t
5770: 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65  he.** row or one
5780: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69   of the rows bei
5790: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ng modified..**.
57a0: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69  ** If argument i
57b0: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74  sClearTable is t
57c0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e  rue, then the en
57d0: 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
57e0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73   the.** table is
57f0: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c   about to be del
5800: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
5810: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  se invalidate al
5820: 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75  l incrblob.** cu
5830: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  rsors open on an
5840: 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65  y row within the
5850: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5860: 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  -page pgnoRoot..
5870: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
5880: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   if argument isC
5890: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c  learTable is fal
58a0: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  se, then the row
58b0: 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69   with.** rowid i
58c0: 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70  Row is being rep
58d0: 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64  laced or deleted
58e0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
58f0: 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c  nvalidate.** onl
5900: 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62  y those incrblob
5910: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
5920: 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72   that specific r
5930: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
5940: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63  id invalidateInc
5950: 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20  rblobCursors(.  
5960: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
5970: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
5980: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
5990: 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20  check */.  Pgno 
59a0: 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20  pgnoRoot,       
59b0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
59c0: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
59d0: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20  anging */.  i64 
59e0: 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20  iRow,           
59f0: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
5a00: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63   that might be c
5a10: 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  hanging */.  int
5a20: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20   isClearTable   
5a30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5a40: 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69  all rows are bei
5a50: 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b  ng deleted */.){
5a60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
5a70: 20 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61    if( pBtree->ha
5a80: 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20  sIncrblobCur==0 
5a90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
5aa0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
5ab0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65  HoldsMutex(pBtre
5ac0: 65 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e  e) );.  pBtree->
5ad0: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
5ae0: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72   0;.  for(p=pBtr
5af0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
5b00: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
5b10: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75  {.    if( (p->cu
5b20: 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e  rFlags & BTCF_In
5b30: 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20  crblob)!=0 ){.  
5b40: 20 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49      pBtree->hasI
5b50: 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a  ncrblobCur = 1;.
5b60: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
5b70: 6f 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20  oRoot==pgnoRoot 
5b80: 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65  && (isClearTable
5b90: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
5ba0: 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20  ==iRow) ){.     
5bb0: 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
5bc0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
5bd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5be0: 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53  .}..#else.  /* S
5bf0: 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65  tub function whe
5c00: 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d  n INCRBLOB is om
5c10: 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69  itted */.  #defi
5c20: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63  ne invalidateInc
5c30: 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78  rblobCursors(w,x
5c40: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
5c50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
5c60: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
5c70: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
5c80: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
5c90: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
5ca0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
5cb0: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
5cc0: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
5cd0: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
5ce0: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
5cf0: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
5d00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
5d10: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
5d20: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
5d30: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
5d40: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
5d50: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
5d60: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
5d70: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
5d80: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
5d90: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
5da0: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
5db0: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
5dc0: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
5dd0: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
5de0: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
5df0: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
5e00: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
5e10: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
5e20: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
5e30: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
5e40: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
5e50: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
5e60: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
5e70: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
5e80: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
5e90: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
5ea0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
5eb0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
5ec0: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
5ed0: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
5ee0: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
5ef0: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
5f00: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
5f10: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
5f20: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
5f30: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
5f40: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
5f50: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
5f60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5f70: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
5f80: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
5f90: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
5fa0: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
5fb0: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
5fc0: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
5fd0: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
5fe0: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
5ff0: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
6000: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
6010: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
6020: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
6030: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
6040: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
6050: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
6060: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
6070: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
6080: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
6090: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
60a0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
60b0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
60c0: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
60d0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
60e0: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
60f0: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
6100: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
6110: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6120: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
6130: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
6140: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
6150: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
6160: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
6170: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
6180: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
6190: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
61a0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
61b0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
61c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
61d0: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
61e0: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
61f0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
6200: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
6210: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
6220: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
6230: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
6240: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
6250: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
6260: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
6270: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
6280: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
6290: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
62a0: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
62b0: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
62c0: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
62d0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
62e0: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
62f0: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
6300: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
6310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
6320: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
6330: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
6340: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
6350: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
6360: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
6370: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
6380: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
6390: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
63a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
63b0: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
63c0: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
63d0: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
63e0: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
63f0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
6400: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
6410: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
6420: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
6430: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
6440: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
6450: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
6460: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
6470: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c  LITE_OK && pgno<
6480: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  =sqlite3BitvecSi
6490: 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ze(pBt->pHasCont
64a0: 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ent) ){.    rc =
64b0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
64c0: 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  t(pBt->pHasConte
64d0: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  nt, pgno);.  }. 
64e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
64f0: 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42  *.** Query the B
6500: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6510: 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a  ent vector..**.*
6520: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6530: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
6540: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
6550: 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20  page is removed 
6560: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65  from the.** free
6570: 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e  -list for reuse.
6580: 20 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73   It returns fals
6590: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
65a0: 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a  to retrieve the.
65b0: 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ** page from the
65c0: 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74   pager layer wit
65d0: 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e  h the 'no-conten
65e0: 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75  t' flag set. Tru
65f0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
6600: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6610: 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  GetHasContent(Bt
6620: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
6630: 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65  o pgno){.  Bitve
6640: 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73  c *p = pBt->pHas
6650: 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72  Content;.  retur
6660: 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71  n (p && (pgno>sq
6670: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
6680: 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  p) || sqlite3Bit
6690: 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29  vecTest(p, pgno)
66a0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  ));.}../*.** Cle
66b0: 61 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65  ar (destroy) the
66c0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
66d0: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68  ntent bitvec. Th
66e0: 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  is should be.** 
66f0: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
6700: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63  onclusion of eac
6710: 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  h write-transact
6720: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
6730: 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61  oid btreeClearHa
6740: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
6750: 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
6760: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
6770: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
6780: 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f  );.  pBt->pHasCo
6790: 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ntent = 0;.}../*
67a0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20  .** Release all 
67b0: 6f 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  of the apPage[] 
67c0: 70 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73  pages for a curs
67d0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
67e0: 69 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41  id btreeReleaseA
67f0: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74  llCursorPages(Bt
6800: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6810: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
6820: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
6830: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  e; i++){.    rel
6840: 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
6850: 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70  pPage[i]);.    p
6860: 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d  Cur->apPage[i] =
6870: 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e   0;.  }.  pCur->
6880: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f  iPage = -1;.}../
6890: 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
68a0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
68b0: 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  ly argument must
68c0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69   point to a vali
68d0: 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20  d entry.** when 
68e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
68f0: 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61   called (i.e. ha
6900: 76 65 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  ve eState==CURSO
6910: 52 5f 56 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a  R_VALID). This.*
6920: 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61 76 65 73  * function saves
6930: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
6940: 73 6f 72 20 6b 65 79 20 69 6e 20 76 61 72 69 61  sor key in varia
6950: 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20  bles pCur->nKey 
6960: 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65  and.** pCur->pKe
6970: 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y. SQLITE_OK is 
6980: 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
6990: 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c  essful or an SQL
69a0: 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f  ite error .** co
69b0: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
69c0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
69d0: 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20  r is open on an 
69e0: 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68  intkey table, th
69f0: 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  en the integer k
6a00: 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77 69 64  ey.** (the rowid
6a10: 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  ) is stored in p
6a20: 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43  Cur->nKey and pC
6a30: 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65 66 74  ur->pKey is left
6a40: 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e   set to.** NULL.
6a50: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
6a60: 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d  s open on a non-
6a70: 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68  intkey table, th
6a80: 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  en pCur->pKey is
6a90: 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e   .** set to poin
6aa0: 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20  t to a malloced 
6ab0: 62 75 66 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65  buffer pCur->nKe
6ac0: 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  y bytes in size 
6ad0: 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74  containing .** t
6ae0: 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69  he key..*/.stati
6af0: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
6b00: 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
6b10: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ur){.  int rc = 
6b20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
6b30: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
6b40: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
6b50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
6b60: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
6b70: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
6b80: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
6b90: 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 63  ;..  if( pCur->c
6ba0: 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  urIntKey ){.    
6bb0: 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69  /* Only the rowi
6bc0: 64 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  d is required fo
6bd0: 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 20  r a table btree 
6be0: 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65  */.    pCur->nKe
6bf0: 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  y = sqlite3Btree
6c00: 49 6e 74 65 67 65 72 4b 65 79 28 70 43 75 72 29  IntegerKey(pCur)
6c10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
6c20: 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 62  * For an index b
6c30: 74 72 65 65 2c 20 73 61 76 65 20 74 68 65 20 63  tree, save the c
6c40: 6f 6d 70 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74  omplete key cont
6c50: 65 6e 74 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ent */.    void 
6c60: 2a 70 4b 65 79 3b 0a 20 20 20 20 70 43 75 72 2d  *pKey;.    pCur-
6c70: 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42  >nKey = sqlite3B
6c80: 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28  treePayloadSize(
6c90: 70 43 75 72 29 3b 0a 20 20 20 20 70 4b 65 79 20  pCur);.    pKey 
6ca0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
6cb0: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20   pCur->nKey );. 
6cc0: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
6cd0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6ce0: 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 70 43  3BtreePayload(pC
6cf0: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
6d00: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
6d10: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6d20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6d30: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
6d40: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
6d50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6d60: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
6d70: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6d80: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6d90: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
6da0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
6db0: 74 28 20 21 70 43 75 72 2d 3e 63 75 72 49 6e 74  t( !pCur->curInt
6dc0: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
6dd0: 65 79 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ey );.  return r
6de0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
6df0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
6e00: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  sor position in 
6e10: 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74  the variables Bt
6e20: 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20  Cursor.nKey .** 
6e30: 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65  and BtCursor.pKe
6e40: 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20  y. The cursor's 
6e50: 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
6e60: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6e70: 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  EK..**.** The ca
6e80: 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
6e90: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
6ea0: 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65   is valid (has e
6eb0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6ec0: 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  LID).** prior to
6ed0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
6ee0: 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74  utine.  .*/.stat
6ef0: 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f  ic int saveCurso
6f00: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
6f10: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
6f20: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6f30: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
6f40: 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55  ur->eState || CU
6f50: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70  RSOR_SKIPNEXT==p
6f60: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
6f70: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
6f80: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
6f90: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
6fa0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
6fb0: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6fc0: 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
6fd0: 58 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  XT ){.    pCur->
6fe0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6ff0: 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  VALID;.  }else{.
7000: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
7010: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  xt = 0;.  }..  r
7020: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 4b 65  c = saveCursorKe
7030: 79 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  y(pCur);.  if( r
7040: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7050: 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
7060: 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
7070: 43 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Cur);.    pCur->
7080: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7090: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
70a0: 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ..  pCur->curFla
70b0: 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
70c0: 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
70d0: 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73  dOvfl|BTCF_AtLas
70e0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
70f0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
7100: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
7110: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
7120: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
7130: 72 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f  rsOnList(BtCurso
7140: 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72  r*,Pgno,BtCursor
7150: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  *);../*.** Save 
7160: 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
7170: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78   all cursors (ex
7180: 63 65 70 74 20 70 45 78 63 65 70 74 29 20 74 68  cept pExcept) th
7190: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a  at are open on.*
71a0: 2a 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  * the table with
71b0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
71c0: 2e 20 20 22 53 61 76 69 6e 67 20 74 68 65 20 63  .  "Saving the c
71d0: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20  ursor position" 
71e0: 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68  means that.** th
71f0: 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  e location in th
7200: 65 20 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d  e btree is remem
7210: 62 65 72 65 64 20 69 6e 20 73 75 63 68 20 61 20  bered in such a 
7220: 77 61 79 20 74 68 61 74 20 69 74 20 63 61 6e 20  way that it can 
7230: 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b  be.** moved back
7240: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f   to the same spo
7250: 74 20 61 66 74 65 72 20 74 68 65 20 62 74 72 65  t after the btre
7260: 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
7270: 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ied.  This.** ro
7280: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7290: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
72a0: 6f 72 20 70 45 78 63 65 70 74 20 69 73 20 75 73  or pExcept is us
72b0: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
72c0: 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65  .** table, for e
72d0: 78 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44  xample in BtreeD
72e0: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
72f0: 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Insert()..**.** 
7300: 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
7310: 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
7320: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
7330: 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
7340: 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 68  h .** cursors sh
7350: 6f 75 6c 64 20 68 61 76 65 20 74 68 65 69 72 20  ould have their 
7360: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
7370: 61 67 20 73 65 74 2e 20 20 54 68 65 20 62 74 72  ag set.  The btr
7380: 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f  eeCursor().** ro
7390: 75 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20 74  utine enforces t
73a0: 68 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73 20  hat rule.  This 
73b0: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65  routine only nee
73c0: 64 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ds to be called 
73d0: 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d  in.** the uncomm
73e0: 6f 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45 78  on case when pEx
73f0: 70 65 63 74 20 68 61 73 20 74 68 65 20 42 54 43  pect has the BTC
7400: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
7410: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  set..**.** If pE
7420: 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20  xpect!=NULL and 
7430: 69 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72 73  if no other curs
7440: 6f 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e  ors are found on
7450: 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70   the same root-p
7460: 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  age,.** then the
7470: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
7480: 6c 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20 69  lag on pExpect i
7490: 73 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61 76  s cleared, to av
74a0: 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70  oid another.** p
74b0: 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f  ointless call to
74c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
74d0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
74e0: 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20  ion note:  This 
74f0: 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63  routine merely c
7500: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
7510: 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e  any cursors.** n
7520: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e  eed to be saved.
7530: 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74    It calls out t
7540: 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  o saveCursorsOnL
7550: 69 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e  ist() in the (un
7560: 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20  usual).** event 
7570: 74 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65  that cursors are
7580: 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e   in need to bein
7590: 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  g saved..*/.stat
75a0: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
75b0: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
75c0: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
75d0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
75e0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
75f0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
7600: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7610: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7620: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
7630: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
7640: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
7650: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
7660: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
7670: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
7680: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
7690: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
76a0: 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61  t==iRoot) ) brea
76b0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29  k;.  }.  if( p )
76c0: 20 72 65 74 75 72 6e 20 73 61 76 65 43 75 72 73   return saveCurs
76d0: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
76e0: 6f 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20 20  ot, pExcept);.  
76f0: 69 66 28 20 70 45 78 63 65 70 74 20 29 20 70 45  if( pExcept ) pE
7700: 78 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73 20  xcept->curFlags 
7710: 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c  &= ~BTCF_Multipl
7720: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
7730: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69  TE_OK;.}../* Thi
7740: 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  s helper routine
7750: 20 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f   to saveAllCurso
7760: 72 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75  rs does the actu
7770: 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e  al work of savin
7780: 67 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73  g.** the cursors
7790: 20 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63   if and when a c
77a0: 75 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74  ursor is found t
77b0: 68 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71  hat actually req
77c0: 75 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a  uires saving..**
77d0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
77e0: 20 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73   is that no curs
77f0: 6f 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ors need to be s
7800: 61 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f  aved, so this ro
7810: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b  utine is.** brok
7820: 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20  en out from its 
7830: 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20  caller to avoid 
7840: 75 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63  unnecessary stac
7850: 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65  k pointer moveme
7860: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
7870: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
7880: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
7890: 69 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ist(.  BtCursor 
78a0: 2a 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  *p,         /* T
78b0: 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
78c0: 74 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e  that needs savin
78d0: 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f  g */.  Pgno iRoo
78e0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t,          /* O
78f0: 6e 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20  nly save cursor 
7900: 77 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e  with this iRoot.
7910: 20 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72   Save all if zer
7920: 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  o */.  BtCursor 
7930: 2a 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44  *pExcept    /* D
7940: 6f 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20  o not save this 
7950: 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64  cursor */.){.  d
7960: 6f 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  o{.    if( p!=pE
7970: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
7980: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
7990: 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20  t==iRoot) ){.   
79a0: 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
79b0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
79c0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  | p->eState==CUR
79d0: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a  SOR_SKIPNEXT ){.
79e0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
79f0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
7a00: 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
7a10: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
7a20: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
7a30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
7a40: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
7a50: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
7a60: 65 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b  e( p->iPage>0 );
7a70: 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65  .        btreeRe
7a80: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
7a90: 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ges(p);.      }.
7aa0: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
7ab0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65  >pNext;.  }while
7ac0: 28 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ( p );.  return 
7ad0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7ae0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
7af0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
7b00: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
7b10: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
7b20: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
7b30: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
7b40: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
7b50: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
7b60: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
7b70: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
7b80: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
7b90: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
7ba0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
7bb0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
7bc0: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
7bd0: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
7be0: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
7bf0: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
7c00: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
7c10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
7c20: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
7c30: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
7c40: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
7c50: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
7c60: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
7c70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
7c80: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
7c90: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
7ca0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
7cb0: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
7cc0: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
7cd0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
7ce0: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
7cf0: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
7d00: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
7d10: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
7d20: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
7d30: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
7d40: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
7d50: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
7d60: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
7d70: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
7d80: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
7d90: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
7da0: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
7db0: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
7dc0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
7dd0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7df0: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
7e00: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
7e10: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
7e20: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
7e30: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   */..  if( pKey 
7e40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
7e50: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
7e60: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
7e70: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
7e80: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
7e90: 6f 72 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ord(pCur->pKeyIn
7ea0: 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  fo);.    if( pId
7eb0: 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
7ec0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
7ed0: 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  PT;.    sqlite3V
7ee0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
7ef0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
7f00: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
7f10: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
7f20: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
7f30: 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ld==0 ){.      r
7f40: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
7f50: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
7f60: 6f 74 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b  oto moveto_done;
7f70: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7f80: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
7f90: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
7fa0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
7fb0: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
7fc0: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
7fd0: 2c 20 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f  , pRes);.moveto_
7fe0: 64 6f 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78  done:.  if( pIdx
7ff0: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
8000: 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70  e3DbFree(pCur->p
8010: 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64  KeyInfo->db, pId
8020: 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  xKey);.  }.  ret
8030: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8040: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
8050: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
8060: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
8070: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
8080: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
8090: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
80a0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
80b0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
80c0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
80d0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
80e0: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
80f0: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
8100: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
8110: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
8120: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
8130: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
8140: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
8150: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
8160: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
8170: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
8180: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
8190: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
81a0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
81b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
81c0: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73   skipNext;.  ass
81d0: 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
81e0: 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
81f0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
8200: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
8210: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
8220: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
8230: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
8240: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
8250: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
8260: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
8270: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
8280: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
8290: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
82a0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
82b0: 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74  ey, 0, &skipNext
82c0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
82d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
82e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
82f0: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
8300: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
8310: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
8320: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
8330: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
8340: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
8350: 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ID );.    pCur->
8360: 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70  skipNext |= skip
8370: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  Next;.    if( pC
8380: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20  ur->skipNext && 
8390: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
83a0: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
83b0: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
83c0: 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45   = CURSOR_SKIPNE
83d0: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  XT;.    }.  }.  
83e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
83f0: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
8400: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
8410: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
8420: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
8430: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
8440: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
8450: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
8460: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
8470: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
8480: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
8490: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
84a0: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
84b0: 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a   position where.
84c0: 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70  ** it was last p
84d0: 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65  laced, or has be
84e0: 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66  en invalidated f
84f0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61  or any other rea
8500: 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20  son..** Cursors 
8510: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
8520: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
8530: 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65  ointing at is de
8540: 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f  leted out.** fro
8550: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f  m under them, fo
8560: 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73  r example.  Curs
8570: 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f  or might also mo
8580: 76 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a  ve if a btree.**
8590: 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a   is rebalanced..
85a0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  **.** Calling th
85b0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
85c0: 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f  a NULL cursor po
85d0: 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61  inter returns fa
85e0: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  lse..**.** Use t
85f0: 68 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69  he separate sqli
8600: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
8610: 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20  store() routine 
8620: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72  to restore a cur
8630: 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77  sor.** back to w
8640: 68 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f  here it ought to
8650: 20 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74   be if this rout
8660: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
8670: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8680: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
8690: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
86a0: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
86b0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
86c0: 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  OR_VALID;.}../*.
86d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
86e0: 72 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f  restores a curso
86f0: 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  r back to its or
8700: 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20  iginal position 
8710: 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20  after it.** has 
8720: 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f  been moved by so
8730: 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76  me outside activ
8740: 69 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62  ity (such as a b
8750: 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f  tree rebalance o
8760: 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e  r.** a row havin
8770: 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  g been deleted o
8780: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
8790: 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a  e cursor).  .**.
87a0: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74  ** On success, t
87b0: 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f  he *pDifferentRo
87c0: 77 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66  w parameter is f
87d0: 61 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73  alse if the curs
87e0: 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f  or is left.** po
87f0: 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c  inting at exactl
8800: 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20  y the same row. 
8810: 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69   *pDifferntRow i
8820: 73 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75  s the row the cu
8830: 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e  rsor.** was poin
8840: 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e  ting to has been
8850: 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e   deleted, forcin
8860: 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
8870: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a  point to some.**
8880: 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a   nearby row..**.
8890: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
88a0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
88b0: 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73  alled for a curs
88c0: 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74  or that just ret
88d0: 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72  urned.** TRUE fr
88e0: 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  om sqlite3BtreeC
88f0: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e  ursorHasMoved().
8900: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
8910: 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
8920: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
8930: 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e  , int *pDifferen
8940: 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  tRow){.  int rc;
8950: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
8960: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8970: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
8980: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
8990: 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
89a0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
89b0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
89c0: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
89d0: 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
89e0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
89f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
8a00: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
8a10: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
8a20: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
8a30: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
8a40: 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a  >skipNext==0 );.
8a50: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
8a60: 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ow = 0;.  }.  re
8a70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8a80: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8a90: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
8aa0: 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  INTS./*.** Provi
8ab0: 64 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20  de hints to the 
8ac0: 63 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72  cursor.  The par
8ad0: 74 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76  ticular hint giv
8ae0: 65 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65  en (and the type
8af0: 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  .** and number o
8b00: 66 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61  f the varargs pa
8b10: 72 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74  rameters) is det
8b20: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65  ermined by the e
8b30: 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61  HintType.** para
8b40: 6d 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20  meter.  See the 
8b50: 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74  definitions of t
8b60: 68 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20  he BTREE_HINT_* 
8b70: 6d 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69  macros for detai
8b80: 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ls..*/.void sqli
8b90: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69  te3BtreeCursorHi
8ba0: 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
8bb0: 72 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65  r, int eHintType
8bc0: 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65  , ...){.  /* Use
8bd0: 64 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d  d only by system
8be0: 20 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65   that substitute
8bf0: 20 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61   their own stora
8c00: 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23  ge engine */.}.#
8c10: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  endif../*.** Pro
8c20: 76 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20  vide flag hints 
8c30: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  to the cursor..*
8c40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
8c50: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61  reeCursorHintFla
8c60: 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  gs(BtCursor *pCu
8c70: 72 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a  r, unsigned x){.
8c80: 20 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52    assert( x==BTR
8c90: 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d  EE_SEEK_EQ || x=
8ca0: 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20  =BTREE_BULKLOAD 
8cb0: 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75  || x==0 );.  pCu
8cc0: 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a  r->hints = x;.}.
8cd0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8ce0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8cf0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70  ./*.** Given a p
8d00: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
8d10: 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65  regular database
8d20: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68   page, return th
8d30: 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
8d40: 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72   for the pointer
8d50: 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63  -map page that c
8d60: 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72  ontains the entr
8d70: 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70  y for the.** inp
8d80: 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  ut page number..
8d90: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28  **.** Return 0 (
8da0: 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65  not a valid page
8db0: 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69  ) for pgno==1 si
8dc0: 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  nce there is.** 
8dd0: 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61  no pointer map a
8de0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
8df0: 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65  age 1.  The inte
8e00: 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69  grity_check logi
8e10: 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68  c.** requires th
8e20: 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  at ptrmapPageno(
8e30: 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74  *,1)!=1..*/.stat
8e40: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
8e50: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
8e60: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
8e70: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
8e80: 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69  apPage;.  Pgno i
8e90: 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61  PtrMap, ret;.  a
8ea0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8eb0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
8ec0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
8ed0: 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30  gno<2 ) return 0
8ee0: 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70  ;.  nPagesPerMap
8ef0: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
8f00: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
8f10: 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d  iPtrMap = (pgno-
8f20: 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50  2)/nPagesPerMapP
8f30: 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50  age;.  ret = (iP
8f40: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
8f50: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
8f60: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
8f70: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
8f80: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
8f90: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
8fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
8fb0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
8fc0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
8fd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8fe0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
8ff0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
9000: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
9010: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
9020: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
9030: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
9040: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
9050: 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pgno'..**.** If 
9060: 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c  *pRC is initiall
9070: 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d  y non-zero (non-
9080: 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20  SQLITE_OK) then 
9090: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
90a0: 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  ** a no-op.  If 
90b0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
90c0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
90d0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77   error code is w
90e0: 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
90f0: 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pRC..*/.static v
9100: 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74  oid ptrmapPut(Bt
9110: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
9120: 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c  o key, u8 eType,
9130: 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e   Pgno parent, in
9140: 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67  t *pRC){.  DbPag
9150: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20  e *pDbPage;  /* 
9160: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
9170: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50  page */.  u8 *pP
9180: 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54  trmap;      /* T
9190: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64  he pointer map d
91a0: 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ata */.  Pgno iP
91b0: 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68  trmap;     /* Th
91c0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
91d0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ge number */.  i
91e0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
91f0: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
9200: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
9210: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
9220: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
9230: 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
9240: 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28  ctions */..  if(
9250: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
9260: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9270: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
9280: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
9290: 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  * The master-jou
92a0: 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  rnal page number
92b0: 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20   is never added 
92c0: 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
92d0: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
92e0: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
92f0: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
9300: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
9310: 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
9320: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
9330: 45 4e 54 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  ENT.  if( pBt->p
9340: 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  Map ){.    *pRC 
9350: 3d 20 62 74 72 65 65 50 74 72 6d 61 70 53 74 6f  = btreePtrmapSto
9360: 72 65 28 70 42 74 2c 20 6b 65 79 2c 20 65 54 79  re(pBt, key, eTy
9370: 70 65 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  pe, parent);.   
9380: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
9390: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
93a0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
93b0: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
93c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
93d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
93e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
93f0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
9400: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
9410: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
9420: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
9430: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
9440: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
9450: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9460: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
9470: 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
9480: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rn;.  }.  offset
9490: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
94a0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
94b0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
94c0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
94d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
94e0: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
94f0: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
9500: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
9510: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
9520: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70  bleSize-5 );.  p
9530: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
9540: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
9550: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
9560: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
9570: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
9580: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
9590: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
95a0: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
95b0: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
95c0: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
95d0: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
95e0: 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d  ent));.    *pRC=
95f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
9600: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
9610: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9620: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9630: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
9640: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
9650: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
9660: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
9670: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
9680: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
9690: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
96a0: 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  f(pDbPage);.}../
96b0: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
96c0: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
96d0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
96e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
96f0: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
9700: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
9710: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
9720: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
9730: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
9740: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
9750: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
9760: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
9770: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
9780: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
9790: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
97a0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
97b0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
97c0: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
97d0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
97e0: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
97f0: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
9800: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
9810: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
9820: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
9830: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
9840: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9850: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
9860: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
9870: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
9880: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
9890: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
98a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
98b0: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
98c0: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
98d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
98e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
98f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
9900: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
9910: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
9920: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
9930: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
9940: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
9950: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
9960: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
9970: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9980: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
9990: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
99a0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
99b0: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
99c0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
99d0: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
99e0: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
99f0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
9a00: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
9a10: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
9a20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9a30: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
9a40: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
9a50: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
9a60: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
9a70: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
9a80: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
9a90: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
9aa0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
9ab0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
9ac0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
9ad0: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
9ae0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
9af0: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
9b00: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
9b10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9b20: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
9b30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9b40: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
9b50: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
9b60: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
9b70: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
9b80: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
9b90: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
9ba0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
9bb0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
9bc0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
9bd0: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
9be0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
9bf0: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
9c00: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
9c10: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
9c20: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
9c30: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
9c40: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
9c50: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
9c60: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
9c70: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
9c80: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
9c90: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
9ca0: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
9cb0: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
9cc0: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
9cd0: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
9ce0: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
9cf0: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
9d00: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
9d10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9d20: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
9d30: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
9d40: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
9d50: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
9d60: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
9d70: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
9d80: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
9d90: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
9da0: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
9db0: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
9dc0: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
9dd0: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
9de0: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
9df0: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
9e00: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
9e10: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
9e20: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
9e30: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
9e40: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
9e50: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
9e60: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
9e70: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9e80: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
9e90: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
9ea0: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
9eb0: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
9ec0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
9ed0: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
9ee0: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
9ef0: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
9f00: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
9f10: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
9f20: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
9f30: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9f40: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
9f50: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
9f60: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9f70: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9f80: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9f90: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9fb0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9fc0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9fd0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9fe0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9ff0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
a000: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
a010: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
a020: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
a030: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
a040: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
a050: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
a060: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
a070: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
a080: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
a090: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
a0a0: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
a0b0: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
a0c0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
a0d0: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
a0e0: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
a0f0: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
a100: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
a110: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
a120: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
a130: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
a140: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
a150: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
a160: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
a170: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
a180: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
a190: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
a1a0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
a1b0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
a1c0: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
a1d0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
a1e0: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
a1f0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
a200: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
a210: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
a220: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
a230: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
a240: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
a250: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
a260: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
a270: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
a280: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
a290: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
a2a0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
a2b0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
a2c0: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
a2d0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
a2e0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
a2f0: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
a300: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a310: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
a320: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
a330: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
a340: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
a350: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
a360: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
a370: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
a380: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
a390: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
a3a0: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
a3b0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
a3c0: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
a3d0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
a3e0: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
a3f0: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
a400: 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d   - pCell) + 4;.}
a410: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
a420: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
a430: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
a440: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
a450: 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a  e.xParseCell().*
a460: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
a470: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
a480: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
a490: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
a4a0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
a4b0: 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  *.** btreeParseC
a4c0: 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20  ellPtr()        
a4d0: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
a4e0: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62   leaf nodes.** b
a4f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50  treeParseCellNoP
a500: 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74  ayload()  =>   t
a510: 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72  able btree inter
a520: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72  nal nodes.** btr
a530: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
a540: 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64  dex()   =>   ind
a550: 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a  ex btree nodes.*
a560: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c  *.** There is al
a570: 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e  so a wrapper fun
a580: 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65  ction btreeParse
a590: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
a5a0: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d  s for.** all Mem
a5b0: 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74  Page types and t
a5c0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
a5d0: 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78  he cell by index
a5e0: 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20   rather than.** 
a5f0: 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  by pointer..*/.s
a600: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
a610: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
a620: 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65  yload(.  MemPage
a630: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
a640: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
a650: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
a660: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
a670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
a680: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
a690: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
a6a0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
a6b0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
a6c0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
a6d0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  .){.  assert( sq
a6e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a6f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a700: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a710: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
a720: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
a730: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a740: 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==4 );.#ifndef S
a750: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
a760: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
a770: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
a780: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a790: 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43   + getVarint(&pC
a7a0: 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70  ell[4], (u64*)&p
a7b0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70  Info->nKey);.  p
a7c0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
a7d0: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f   0;.  pInfo->nLo
a7e0: 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  cal = 0;.  pInfo
a7f0: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
a800: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
a810: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
a820: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
a830: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
a840: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
a850: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
a860: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a880: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
a890: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
a8a0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
a8b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
a8c0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
a8d0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
a8e0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
a8f0: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
a900: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
a910: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
a920: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
a930: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
a940: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
a950: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a970: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
a980: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
a990: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a9a0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
a9b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
a9c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
a9d0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
a9e0: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
a9f0: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
aa00: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
aa10: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
aa20: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
aa30: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
aa40: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
aa50: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
aa60: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
aa70: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
aa80: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
aa90: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
aaa0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
aab0: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
aac0: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
aad0: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
aae0: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
aaf0: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
ab00: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
ab10: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
ab20: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
ab30: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
ab40: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
ab50: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
ab60: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
ab70: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
ab80: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
ab90: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
aba0: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
abb0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
abc0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
abd0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
abe0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
abf0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
ac00: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
ac10: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
ac20: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
ac30: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
ac40: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
ac50: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
ac60: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
ac70: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
ac80: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
ac90: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
aca0: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
acb0: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
acc0: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
acd0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
ace0: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
acf0: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
ad00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
ad10: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
ad20: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
ad30: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
ad40: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
ad50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ad60: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
ad70: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
ad80: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
ad90: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
ada0: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
adb0: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
adc0: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
add0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
ade0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
adf0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
ae00: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
ae10: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
ae20: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
ae30: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
ae40: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
ae50: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
ae60: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
ae70: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
ae80: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
ae90: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
aea0: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
aeb0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
aec0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
aed0: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
aee0: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
aef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
af00: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
af10: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
af20: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
af30: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
af40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
af50: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
af60: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
af70: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
af80: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
af90: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
afa0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
afb0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
afc0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
afd0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
afe0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
aff0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
b000: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
b010: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
b020: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
b030: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
b040: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
b050: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
b060: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
b070: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
b080: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
b090: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
b0a0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
b0b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b0c0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
b0d0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
b0e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b0f0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
b100: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b110: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
b120: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
b130: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
b140: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
b150: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
b160: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
b170: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b180: 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
b190: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
b1a0: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
b1b0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
b1c0: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
b1d0: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
b1e0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
b1f0: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
b200: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
b210: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
b220: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
b230: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
b240: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
b250: 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f  pIter++;.  pInfo
b260: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
b270: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  d;.  pInfo->nPay
b280: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
b290: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
b2a0: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
b2b0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
b2c0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
b2d0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
b2e0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
b2f0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
b300: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
b310: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
b320: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
b330: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
b340: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
b350: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
b360: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
b370: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
b380: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
b390: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
b3a0: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
b3b0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
b3c0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
b3d0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
b3e0: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
b3f0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
b400: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
b410: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
b420: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
b430: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
b440: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
b450: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
b460: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
b470: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
b480: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
b490: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
b4a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
b4b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
b4c0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
b4d0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
b4e0: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
b4f0: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
b500: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
b510: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
b520: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
b530: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
b540: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
b550: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
b560: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
b570: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
b580: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
b590: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
b5a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
b5b0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
b5c0: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
b5d0: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
b5e0: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
b5f0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
b600: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
b610: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
b620: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
b630: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
b640: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
b650: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
b660: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
b670: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
b680: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
b690: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
b6a0: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
b6b0: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
b6c0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
b6d0: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
b6e0: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
b6f0: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
b700: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
b710: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
b720: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
b730: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
b740: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
b750: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
b760: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
b770: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
b780: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
b790: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
b7a0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
b7b0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
b7c0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
b7d0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
b800: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
b810: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
b820: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
b850: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
b860: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b870: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
b880: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
b890: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
b8a0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
b8b0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
b8c0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
b8d0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
b8e0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
b8f0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
b900: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
b910: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
b920: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
b930: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
b940: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
b950: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
b960: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
b970: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
b980: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
b990: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
b9a0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
b9b0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
b9c0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
b9d0: 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b   nSize = *pIter;
b9e0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78  .  if( nSize>=0x
b9f0: 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  80 ){.    pEnd =
ba00: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
ba10: 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20  nSize &= 0x7f;. 
ba20: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69     do{.      nSi
ba30: 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20  ze = (nSize<<7) 
ba40: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
ba50: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
ba60: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
ba70: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
ba80: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
ba90: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
baa0: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49  Key ){.    /* pI
bab0: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
bac0: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
bad0: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
bae0: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
baf0: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
bb00: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
bb10: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
bb20: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
bb30: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
bb40: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
bb50: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
bb60: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
bb70: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
bb80: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
bb90: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
bba0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74  <pEnd );.  }.  t
bbb0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
bbc0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
bbd0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
bbe0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
bbf0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
bc00: 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d   nSize<=pPage->m
bc10: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
bc20: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
bc30: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
bc40: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20    if( nSize<4 ) 
bc50: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c  nSize = 4;.  }el
bc60: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c  se{.    int minL
bc70: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
bc80: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
bc90: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
bca0: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
bcb0: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
bcc0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
bcd0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bce0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
bcf0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
bd00: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
bd10: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
bd20: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
bd30: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
bd40: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
bd50: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
bd60: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
bd70: 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  4 + (u16)(pIter 
bd80: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
bd90: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
bda0: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c  ebuginfo.nSize |
bdb0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
bdc0: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
bdd0: 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  ize;.}.static u1
bde0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  6 cellSizePtrNoP
bdf0: 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a  ayload(MemPage *
be00: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
be10: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
be20: 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46   pCell + 4; /* F
be30: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
be40: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
be50: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
be60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
be70: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
be80: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
be90: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
bea0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
beb0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
bec0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
bed0: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
bee0: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
bef0: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
bf00: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
bf10: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
bf20: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
bf30: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
bf40: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
bf50: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
bf60: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
bf70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
bf80: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
bf90: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
bfa0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
bfb0: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
bfc0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
bfd0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
bfe0: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
bff0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
c000: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
c010: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
c020: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
c030: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
c040: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
c050: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
c060: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
c070: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
c080: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
c090: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
c0a0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
c0b0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
c0c0: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
c0d0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
c0e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
c0f0: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
c100: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
c110: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
c120: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
c130: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
c140: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
c150: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
c160: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
c170: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
c180: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
c190: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
c1a0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
c1b0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
c1c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c1d0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
c1e0: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
c1f0: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
c200: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
c210: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
c220: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
c230: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
c240: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
c250: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
c260: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
c270: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
c280: 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  d ptrmapPutOvflP
c290: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
c2a0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e  e, u8 *pCell, in
c2b0: 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49  t *pRC){.  CellI
c2c0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
c2d0: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
c2e0: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
c2f0: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  0 );.  pPage->xP
c300: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
c310: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
c320: 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
c330: 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
c340: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
c350: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
c360: 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29  l[info.nSize-4])
c370: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
c380: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
c390: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
c3a0: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
c3b0: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
c3c0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
c3d0: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
c3e0: 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75 74  given. This rout
c3f0: 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73 20  ine reorganizes 
c400: 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  cells within the
c410: 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61 74  .** page so that
c420: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   there are no fr
c430: 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  ee-blocks on the
c440: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74   free-block list
c450: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
c460: 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74 68  r nMaxFrag is th
c470: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
c480: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 73   of fragmented s
c490: 70 61 63 65 20 74 68 61 74 20 6d 61 79 20 62 65  pace that may be
c4a0: 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74  .** present in t
c4b0: 68 65 20 70 61 67 65 20 61 66 74 65 72 20 74 68  he page after th
c4c0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
c4d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e  ns..**.** EVIDEN
c4e0: 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36  CE-OF: R-44582-6
c4f0: 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20  0138 SQLite may 
c500: 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d  from time to tim
c510: 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a  e reorganize a.*
c520: 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f  * b-tree page so
c530: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
c540: 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72  no freeblocks or
c550: 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c   fragment bytes,
c560: 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62   all.** unused b
c570: 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e  ytes are contain
c580: 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f  ed in the unallo
c590: 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69  cated space regi
c5a0: 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63  on, and all.** c
c5b0: 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20  ells are packed 
c5c0: 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65  tightly at the e
c5d0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
c5e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
c5f0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
c600: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
c610: 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69 6e   nMaxFrag){.  in
c620: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c630: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c640: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
c650: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
c660: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
c670: 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ess of the i-th 
c680: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
c690: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c6a0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
c6b0: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
c6c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
c6f0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
c700: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
c710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c720: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
c730: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
c740: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
c750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
c760: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
c770: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
c780: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
c790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c7a0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
c7b0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
c7c0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c7e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
c7f0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
c800: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c810: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
c820: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
c830: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
c840: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
c850: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
c860: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
c870: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c880: 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  *src;        /* 
c890: 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e  Source of conten
c8a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
c8b0: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
c8c0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
c8d0: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
c8e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
c8f0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
c900: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
c910: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
c920: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c930: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
c940: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
c950: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
c960: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
c970: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c980: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
c990: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
c9a0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
c9b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
c9c0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
c9d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
c9e0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
c9f0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ca00: 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72    temp = 0;.  sr
ca10: 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65  c = data = pPage
ca20: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
ca30: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
ca40: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
ca50: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
ca60: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
ca70: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
ca80: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
ca90: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
caa0: 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46  +3]) );.  iCellF
cab0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
cac0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75  t + 2*nCell;.  u
cad0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
cae0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
caf0: 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  ze;..  /* This b
cb00: 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61 67  lock handles pag
cb10: 65 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20 66  es with two or f
cb20: 65 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b 73  ewer free blocks
cb30: 20 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20 20   and nMaxFrag.  
cb40: 2a 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61 67  ** or fewer frag
cb50: 6d 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49 6e  mented bytes. In
cb60: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
cb70: 20 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65 20   faster to move 
cb80: 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72  the.  ** two (or
cb90: 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20   one) blocks of 
cba0: 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d  cells using memm
cbb0: 6f 76 65 28 29 20 61 6e 64 20 61 64 64 20 74 68  ove() and add th
cbc0: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
cbd0: 6f 66 66 73 65 74 73 20 74 6f 20 65 61 63 68 20  offsets to each 
cbe0: 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
cbf0: 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
cc00: 79 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20  y than it is to 
cc10: 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63  .  ** reconstruc
cc20: 74 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  t the entire pag
cc30: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e  e.  */.  if( (in
cc40: 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e  t)data[hdr+7]<=n
cc50: 4d 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20 69  MaxFrag ){.    i
cc60: 6e 74 20 69 46 72 65 65 20 3d 20 67 65 74 32 62  nt iFree = get2b
cc70: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
cc80: 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  );.    if( iFree
cc90: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46   ){.      int iF
cca0: 72 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28  ree2 = get2byte(
ccb0: 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 0a  &data[iFree]);..
ccc0: 20 20 20 20 20 20 2f 2a 20 70 61 67 65 46 69 6e        /* pageFin
ccd0: 64 53 6c 6f 74 28 29 20 68 61 73 20 61 6c 72 65  dSlot() has alre
cce0: 61 64 79 20 76 65 72 69 66 69 65 64 20 74 68 61  ady verified tha
ccf0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 72  t free blocks ar
cd00: 65 20 73 6f 72 74 65 64 0a 20 20 20 20 20 20 2a  e sorted.      *
cd10: 2a 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 6f 66  * in order of of
cd20: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
cd30: 70 61 67 65 2c 20 61 6e 64 20 74 68 61 74 20 6e  page, and that n
cd40: 6f 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 0a  o block extends.
cd50: 20 20 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68        ** past th
cd60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
cd70: 65 2e 20 50 72 6f 76 69 64 65 64 20 74 68 65 20  e. Provided the 
cd80: 74 77 6f 20 66 72 65 65 20 73 6c 6f 74 73 20 64  two free slots d
cd90: 6f 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20  o not .      ** 
cda0: 6f 76 65 72 6c 61 70 2c 20 74 68 69 73 20 67 75  overlap, this gu
cdb0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
cdc0: 65 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61 6c 6c  e memmove() call
cdd0: 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  s below will not
cde0: 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  .      ** overwr
cdf0: 69 74 65 20 74 68 65 20 75 73 61 62 6c 65 53 69  ite the usableSi
ce00: 7a 65 20 62 79 74 65 20 62 75 66 66 65 72 2c 20  ze byte buffer, 
ce10: 65 76 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  even if the data
ce20: 62 61 73 65 20 70 61 67 65 0a 20 20 20 20 20 20  base page.      
ce30: 2a 2a 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  ** is corrupt.  
ce40: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ce50: 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46   iFree2==0 || iF
ce60: 72 65 65 32 3e 69 46 72 65 65 20 29 3b 0a 20 20  ree2>iFree );.  
ce70: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
ce80: 65 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  e+get2byte(&data
ce90: 5b 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20 75 73  [iFree+2]) <= us
cea0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
ceb0: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32    assert( iFree2
cec0: 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b 67 65  ==0 || iFree2+ge
ced0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
cee0: 65 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c  ee2+2]) <= usabl
cef0: 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 20 20  eSize );..      
cf00: 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20 7c 7c  if( 0==iFree2 ||
cf10: 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d 3d 3d   (data[iFree2]==
cf20: 30 20 26 26 20 64 61 74 61 5b 69 46 72 65 65 32  0 && data[iFree2
cf30: 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  +1]==0) ){.     
cf40: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 64     u8 *pEnd = &d
cf50: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
cf60: 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20   nCell*2];.     
cf70: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a 20 20     u8 *pAddr;.  
cf80: 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20 3d 20        int sz2 = 
cf90: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  0;.        int s
cfa0: 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  z = get2byte(&da
cfb0: 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a 20 20  ta[iFree+2]);.  
cfc0: 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20 3d 20        int top = 
cfd0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
cfe0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20  dr+5]);.        
cff0: 69 66 28 20 69 46 72 65 65 32 20 29 7b 0a 20 20  if( iFree2 ){.  
d000: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
d010: 65 2b 73 7a 3e 69 46 72 65 65 32 20 29 20 72 65  e+sz>iFree2 ) re
d020: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d030: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
d040: 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79      sz2 = get2by
d050: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
d060: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  2]);.          a
d070: 73 73 65 72 74 28 20 69 46 72 65 65 2b 73 7a 2b  ssert( iFree+sz+
d080: 73 7a 32 2b 69 46 72 65 65 32 2d 28 69 46 72 65  sz2+iFree2-(iFre
d090: 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65 53  e+sz) <= usableS
d0a0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
d0b0: 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69   memmove(&data[i
d0c0: 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64  Free+sz+sz2], &d
d0d0: 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20 69  ata[iFree+sz], i
d0e0: 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29  Free2-(iFree+sz)
d0f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
d100: 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20 20 20 20  += sz2;.        
d110: 7d 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d  }.        cbrk =
d120: 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20   top+sz;.       
d130: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69   assert( cbrk+(i
d140: 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61  Free-top) <= usa
d150: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
d160: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
d170: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f  [cbrk], &data[to
d180: 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a  p], iFree-top);.
d190: 20 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64          for(pAdd
d1a0: 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  r=&data[cellOffs
d1b0: 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b  et]; pAddr<pEnd;
d1c0: 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20   pAddr+=2){.    
d1d0: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
d1e0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
d1f0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72        if( pc<iFr
d200: 65 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  ee ){ put2byte(p
d210: 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a  Addr, pc+sz); }.
d220: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
d230: 66 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20  f( pc<iFree2 ){ 
d240: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
d250: 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20  pc+sz2); }.     
d260: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
d270: 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74  o defragment_out
d280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d290: 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73    }..  cbrk = us
d2a0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
d2b0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
d2c0: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
d2d0: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
d2e0: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
d2f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
d300: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
d310: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
d320: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
d330: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
d340: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
d350: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
d360: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
d370: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
d380: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
d390: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
d3a0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
d3b0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
d3c0: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
d3d0: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
d3e0: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
d3f0: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
d400: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
d410: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
d420: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
d430: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d440: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d450: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  }.    assert( pc
d460: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20  >=iCellFirst && 
d470: 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc<=iCellLast );
d480: 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67  .    size = pPag
d490: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
d4a0: 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20  ge, &src[pc]);. 
d4b0: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
d4c0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
d4d0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73  ellFirst || pc+s
d4e0: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
d4f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
d500: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d510: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
d520: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
d530: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
d540: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
d550: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
d560: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
d570: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
d580: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
d590: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
d5a0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
d5b0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66  r, cbrk);.    if
d5c0: 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  ( temp==0 ){.   
d5d0: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20     int x;.      
d5e0: 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63  if( cbrk==pc ) c
d5f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74  ontinue;.      t
d600: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  emp = sqlite3Pag
d610: 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67  erTempSpace(pPag
d620: 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  e->pBt->pPager);
d630: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
d640: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
d650: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
d660: 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b  &temp[x], &data[
d670: 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20  x], (cbrk+size) 
d680: 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20  - x);.      src 
d690: 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20  = temp;.    }.  
d6a0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
d6b0: 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20  brk], &src[pc], 
d6c0: 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74  size);.  }.  dat
d6d0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20  a[hdr+7] = 0;.. 
d6e0: 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a  defragment_out:.
d6f0: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37    if( data[hdr+7
d700: 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  ]+cbrk-iCellFirs
d710: 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t!=pPage->nFree 
d720: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d730: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d740: 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
d750: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
d760: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
d770: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
d780: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
d790: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
d7a0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  dr+2] = 0;.  mem
d7b0: 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46  set(&data[iCellF
d7c0: 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69  irst], 0, cbrk-i
d7d0: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73  CellFirst);.  as
d7e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d7f0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
d800: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d810: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d820: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
d830: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
d840: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
d850: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
d860: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
d870: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
d880: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
d890: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
d8a0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
d8b0: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
d8c0: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
d8d0: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
d8e0: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
d8f0: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
d900: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
d910: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
d920: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d930: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
d940: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
d950: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
d960: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
d970: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
d980: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
d990: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
d9a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
d9b0: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
d9c0: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
d9d0: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
d9e0: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
d9f0: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
da00: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
da10: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
da20: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
da30: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
da40: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
da50: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
da60: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
da70: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
da80: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
da90: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
daa0: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
dab0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
dac0: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
dad0: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
dae0: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
daf0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
db00: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
db10: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
db20: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
db30: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
db40: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
db50: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
db60: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  ;..  assert( pc>
db70: 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  0 );.  do{.    i
db80: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
db90: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
dba0: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
dbb0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
dbc0: 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32  OF: R-06866-3912
dbd0: 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  5 Freeblocks are
dbe0: 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65   always connecte
dbf0: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20  d in order of.  
dc00: 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20    ** increasing 
dc10: 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69  offset. */.    i
dc20: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
dc30: 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34  -4 || pc<iAddr+4
dc40: 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
dc50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
dc60: 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
dc70: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
dc80: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
dc90: 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54 68  R-22710-53328 Th
dca0: 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72  e third and four
dcb0: 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  th bytes of each
dcc0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  .    ** freebloc
dcd0: 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64  k form a big-end
dce0: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
dcf0: 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  h is the size of
dd00: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20   the freeblock. 
dd10: 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20     ** in bytes, 
dd20: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d  including the 4-
dd30: 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  byte header. */.
dd40: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
dd50: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
dd60: 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20  );.    if( (x = 
dd70: 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30  size - nByte)>=0
dd80: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
dd90: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
dda0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
ddb0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
ddc0: 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73   < pPg->cellOffs
ddd0: 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20  et+2*pPg->nCell 
dde0: 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  || size+pc > usa
ddf0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
de00: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
de10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
de20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
de30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
de40: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
de50: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
de60: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
de70: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
de80: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
de90: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
dea0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
deb0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
dec0: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
ded0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
dee0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20  aData[hdr+7]>57 
def0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
df00: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
df10: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
df20: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
df30: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
df40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67  .        ** frag
df50: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
df60: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
df70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
df80: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26  &aData[iAddr], &
df90: 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  aData[pc], 2);. 
dfa0: 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72         aData[hdr
dfb0: 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20  +7] += (u8)x;.  
dfc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dfd0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
dfe0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
dff0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
e000: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
e010: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
e020: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
e030: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
e040: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
e050: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
e060: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
e070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e080: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
e090: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20   + x];.    }.   
e0a0: 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20   iAddr = pc;.   
e0b0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
e0c0: 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77  aData[pc]);.  }w
e0d0: 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20 72  hile( pc );..  r
e0e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e0f0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
e100: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
e110: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
e120: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
e130: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
e140: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
e150: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
e160: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
e170: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
e180: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
e190: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
e1a0: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
e1b0: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
e1c0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
e1d0: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
e1e0: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
e1f0: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
e200: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
e210: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
e220: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
e230: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
e240: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
e250: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
e260: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
e270: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
e280: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
e290: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
e2a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
e2b0: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
e2c0: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
e2d0: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
e2e0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
e2f0: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
e300: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
e310: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
e320: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
e330: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
e340: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
e350: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
e360: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
e370: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
e380: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
e390: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
e3a0: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
e3b0: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
e3c0: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
e3d0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
e3e0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
e3f0: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
e400: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
e410: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
e420: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
e430: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
e440: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
e450: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
e480: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
e490: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
e4a0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e4b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e4c0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
e4d0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
e4e0: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
e4f0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
e500: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
e510: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
e520: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
e530: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e540: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
e550: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
e560: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
e570: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
e580: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e590: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
e5a0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
e5b0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
e5c0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
e5d0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
e5e0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
e5f0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
e600: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
e610: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
e620: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
e630: 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70   nByte < (int)(p
e640: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
e650: 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61  eSize-8) );..  a
e660: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
e670: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
e680: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
e690: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
e6a0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
e6b0: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
e6c0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
e6d0: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a  p<=65536 );.  /*
e6e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e6f0: 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74  29356-02391 If t
e700: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73  he database uses
e710: 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61   a 65536-byte pa
e720: 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64  ge size.  ** and
e730: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70   the reserved sp
e740: 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65  ace is zero (the
e750: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72   usual value for
e760: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29   reserved space)
e770: 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  .  ** then the c
e780: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73  ell content offs
e790: 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70  et of an empty p
e7a0: 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20  age wants to be 
e7b0: 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65  65536..  ** Howe
e7c0: 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65  ver, that intege
e7d0: 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  r is too large t
e7e0: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
e7f0: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
e800: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  .  ** integer, s
e810: 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69  o a value of 0 i
e820: 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c  s used in its pl
e830: 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  ace. */.  top = 
e840: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
e850: 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74  dr+5]);.  assert
e860: 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67  ( top<=(int)pPag
e870: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
e880: 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74  ze ); /* Prevent
e890: 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61   by getAndInitPa
e8a0: 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61  ge() */.  if( ga
e8b0: 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  p>top ){.    if(
e8c0: 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65   top==0 && pPage
e8d0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e8e0: 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20  e==65536 ){.    
e8f0: 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20    top = 65536;. 
e900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e920: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
e930: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
e940: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
e950: 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70  pace between gap
e960: 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65   and top for one
e970: 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74   more cell point
e980: 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e  er.  ** array en
e990: 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20  try offset, and 
e9a0: 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  if the freelist 
e9b0: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
e9c0: 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20  en search the.  
e9d0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  ** freelist look
e9e0: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
e9f0: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
ea00: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
ea10: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
ea20: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
ea30: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
ea40: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
ea50: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
ea60: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
ea70: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
ea80: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
ea90: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
eaa0: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
eab0: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
eac0: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
ead0: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
eae0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
eaf0: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
eb00: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
eb10: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
eb20: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
eb30: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
eb40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
eb50: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
eb60: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
eb70: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
eb80: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
eb90: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
eba0: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
ebb0: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
ebc0: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
ebd0: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
ebe0: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
ebf0: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
ec00: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
ec10: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
ec20: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
ec30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ec40: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
ec50: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
ec60: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
ec70: 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d  entPage(pPage, M
ec80: 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72  IN(4, pPage->nFr
ec90: 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29  ee - (2+nByte)))
eca0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
ecb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
ecc0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
ecd0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
ece0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
ecf0: 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20  ap+2+nByte<=top 
ed00: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
ed10: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
ed20: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
ed30: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
ed40: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
ed50: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
ed60: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
ed70: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
ed80: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
ed90: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
eda0: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
edb0: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
edc0: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
edd0: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
ede0: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
edf0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
ee00: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
ee10: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
ee20: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
ee30: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
ee40: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
ee50: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
ee60: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
ee70: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
ee80: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
ee90: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
eea0: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
eeb0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
eec0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
eed0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
eee0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
eef0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
ef00: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
ef10: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
ef20: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
ef30: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
ef40: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
ef50: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
ef60: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
ef70: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
ef80: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
ef90: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
efa0: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
efb0: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
efc0: 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74  Note that even t
efd0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
efe0: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
eff0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
f000: 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74  tPage(),.** that
f010: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
f020: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
f030: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f   between cells o
f040: 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e  r freeblocks.  N
f050: 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65  or.** does it de
f060: 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72  tect cells or fr
f070: 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e  eeblocks that en
f080: 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20  crouch into the 
f090: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a  reserved bytes.*
f0a0: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
f0b0: 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f  the page.  So do
f0c0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72   additional corr
f0d0: 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e  uption checks in
f0e0: 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75  side this.** rou
f0f0: 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tine and return 
f100: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
f110: 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61  f any problems a
f120: 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  re found..*/.sta
f130: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
f140: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
f150: 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31  , u16 iStart, u1
f160: 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20  6 iSize){.  u16 
f170: 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
f1a0: 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65  ptr to next free
f1b0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69  block */.  u16 i
f1c0: 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20  FreeBlk;        
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
f1f0: 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  he next freebloc
f200: 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20  k */.  u8 hdr;  
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f230: 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65  Page header size
f240: 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20  .  0 or 100 */. 
f250: 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20   u8 nFrag = 0;  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74         /* Reduct
f280: 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61  ion in fragmenta
f290: 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f  tion */.  u16 iO
f2a0: 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b  rigSize = iSize;
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
f2d0: 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20  e of iSize */.  
f2e0: 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67  u32 iLast = pPag
f2f0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
f300: 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74  ze-4; /* Largest
f310: 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c   possible freebl
f320: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
f330: 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72  u32 iEnd = iStar
f340: 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20  t + iSize;      
f350: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
f360: 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74  yte past the iSt
f370: 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  art buffer */.  
f380: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
f390: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
f3a0: 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f  ta;   /* Page co
f3b0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
f3c0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
f3d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
f3e0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
f3f0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
f400: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
f410: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
f420: 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d  | iStart>=pPage-
f430: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61  >hdrOffset+6+pPa
f440: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
f450: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
f460: 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64  RRUPT_DB || iEnd
f470: 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   <= pPage->pBt->
f480: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
f490: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f4a0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
f4b0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
f4c0: 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65  .  assert( iSize
f4d0: 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=4 );   /* Mini
f4e0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
f4f0: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
f500: 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b  iStart<=iLast );
f510: 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65  ..  /* Overwrite
f520: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
f530: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
f540: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
f550: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69  delete.  ** opti
f560: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
f570: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
f580: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
f590: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
f5a0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
f5b0: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ata[iStart], 0, 
f5c0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iSize);.  }..  /
f5d0: 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72  * The list of fr
f5e0: 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  eeblocks must be
f5f0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
f600: 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a  der.  Find the .
f610: 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65    ** spot on the
f620: 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61   list where iSta
f630: 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rt should be ins
f640: 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64  erted..  */.  hd
f650: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
f660: 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68  fset;.  iPtr = h
f670: 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61  dr + 1;.  if( da
f680: 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26  ta[iPtr+1]==0 &&
f690: 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29   data[iPtr]==0 )
f6a0: 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d  {.    iFreeBlk =
f6b0: 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74   0;  /* Shortcut
f6c0: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
f6d0: 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  en the freelist 
f6e0: 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65  is empty */.  }e
f6f0: 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
f700: 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32  (iFreeBlk = get2
f710: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
f720: 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20  ))<iStart ){.   
f730: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c     if( iFreeBlk<
f740: 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  iPtr+4 ){.      
f750: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d    if( iFreeBlk==
f760: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
f770: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f780: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
f790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74       }.      iPt
f7a0: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
f7b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
f7c0: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
f7d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f7e0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
f7f0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
f800: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
f810: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
f820: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
f830: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
f840: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
f850: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
f860: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
f870: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
f880: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
f890: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
f8a0: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
f8b0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
f8c0: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
f8d0: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
f8e0: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
f8f0: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
f900: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
f910: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
f920: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
f930: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
f940: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
f950: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
f960: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
f970: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f980: 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  PT;.      iEnd =
f990: 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
f9a0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
f9b0: 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
f9c0: 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d  f( iEnd > pPage-
f9d0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
f9e0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
f9f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
fa00: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
fa10: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
fa20: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
fa30: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
fa40: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
fa50: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
fa60: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
fa70: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
fa80: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
fa90: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
faa0: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
fab0: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
fac0: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
fad0: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
fae0: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
faf0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
fb00: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
fb10: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
fb20: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
fb30: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
fb40: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
fb50: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
fb60: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
fb70: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
fb80: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
fb90: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
fba0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
fbb0: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
fbc0: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
fbd0: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
fbe0: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
fbf0: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
fc00: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
fc10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fc20: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
fc30: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
fc40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fc50: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
fc60: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
fc70: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
fc80: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
fc90: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
fca0: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
fcb0: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
fcc0: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
fcd0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
fce0: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
fcf0: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
fd00: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
fd10: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
fd20: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
fd30: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
fd40: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
fd50: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
fd60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
fd70: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
fd80: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
fd90: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
fda0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
fdb0: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
fdc0: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
fdd0: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
fde0: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
fdf0: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
fe00: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
fe10: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
fe20: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
fe30: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
fe40: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
fe50: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
fe60: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
fe70: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
fe80: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
fe90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fea0: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
feb0: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
fec0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
fed0: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
fee0: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
fef0: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
ff00: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
ff10: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
ff20: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
ff30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
ff40: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
ff50: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
ff60: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
ff70: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
ff80: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
ff90: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
ffa0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
ffb0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
ffc0: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
ffd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ffe0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
fff0: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
10000 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
10010 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
10020 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
10030 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
10040 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
10050 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
10060 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
10070 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
10080 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
10090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
100a0 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
100b0 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
100c0 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
100d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
100e0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
100f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
10100 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
10110 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
10120 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
10130 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
10140 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
10150 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
10160 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
10170 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
10180 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
10190 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b  e = cellSizePtr;
101a0 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
101b0 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
101c0 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
101d0 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
101e0 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
101f0 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d  NCE-OF: R-07291-
10200 33 35 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66  35328 A value of
10210 20 35 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20   5 (0x05) means 
10220 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20  the page is an. 
10230 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74     ** interior t
10240 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
10250 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
10260 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
10270 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b  TF_INTKEY)==5 );
10280 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
10290 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31  -OF: R-26900-091
102a0 37 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33  76 A value of 13
102b0 20 28 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68   (0x0d) means th
102c0 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20  e page is a.    
102d0 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d  ** leaf table b-
102e0 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
102f0 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
10300 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
10310 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33  EY|PTF_LEAF)==13
10320 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
10330 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69  ntKey = 1;.    i
10340 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
10350 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
10360 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20  ntKeyLeaf = 1;. 
10370 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
10380 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
10390 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20  rseCellPtr;.    
103a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
103b0 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
103c0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
103d0 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
103e0 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
103f0 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  d;.      pPage->
10400 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
10410 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f  eeParseCellPtrNo
10420 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20  Payload;.    }. 
10430 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
10440 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61  al = pBt->maxLea
10450 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  f;.    pPage->mi
10460 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
10470 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69  nLeaf;.  }else i
10480 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46  f( flagByte==PTF
10490 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20  _ZERODATA ){.   
104a0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
104b0 20 52 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41   R-43316-37308 A
104c0 20 76 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30   value of 2 (0x0
104d0 32 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  2) means the pag
104e0 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
104f0 6e 74 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d  nterior index b-
10500 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
10510 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
10520 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20  ERODATA)==2 );. 
10530 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
10540 46 3a 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38  F: R-59615-42828
10550 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28   A value of 10 (
10560 30 78 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0a) means the 
10570 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
10580 20 6c 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72   leaf index b-tr
10590 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
105a0 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
105b0 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d  ODATA|PTF_LEAF)=
105c0 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =10 );.    pPage
105d0 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
105e0 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
105f0 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  eaf = 0;.    pPa
10600 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
10610 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
10620 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61  trIndex;.    pPa
10630 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
10640 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
10650 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
10660 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
10670 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
10680 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
10690 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e  R-47608-56469 An
106a0 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f  y other value fo
106b0 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  r the b-tree pag
106c0 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a  e type is.    **
106d0 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
106e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
106f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
10700 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
10710 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
10720 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
10730 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
10740 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10750 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
10760 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
10770 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
10780 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
10790 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
107a0 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
107b0 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
107c0 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
107d0 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
107e0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
107f0 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
10800 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
10810 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
10820 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
10830 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
10840 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10850 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
10860 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
10870 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
10880 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
10890 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
108a0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
108b0 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
108c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
108d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
108e0 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
108f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
10900 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
10910 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10920 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
10930 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10940 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10950 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
10960 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
10970 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
10980 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
10990 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
109a0 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
109b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
109c0 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
109d0 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
109e0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
109f0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
10a00 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
10a10 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 3b  t ){.    int pc;
10a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10a30 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
10a40 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
10a50 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
10a60 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
10a70 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
10a80 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
10a90 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
10aa0 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
10ab0 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
10ac0 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
10ad0 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
10ae0 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
10af0 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
10b00 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69  ructure */.    i
10b10 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
10b20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
10b30 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
10b40 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
10b50 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
10b60 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
10b70 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
10b80 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
10b90 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  inter */.    int
10ba0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
10bb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
10bc0 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
10bd0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
10be0 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
10bf0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
10c00 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10c10 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
10c20 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
10c30 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
10c40 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
10c50 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
10c60 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
10c70 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
10c80 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
10c90 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
10ca0 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
10cb0 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
10cc0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
10cd0 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
10ce0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
10cf0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
10d00 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38  -OF: R-28594-028
10d10 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20  90 The one-byte 
10d20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30  flag at offset 0
10d30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20 20   indicating.    
10d40 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  ** the b-tree pa
10d50 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20  ge type. */.    
10d60 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
10d70 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
10d80 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
10d90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
10da0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
10db0 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
10dc0 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
10dd0 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50  =65536 );.    pP
10de0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
10df0 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
10e00 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50  ize - 1);.    pP
10e10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
10e20 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
10e30 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
10e40 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
10e50 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
10e60 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
10e70 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c   8 + pPage->chil
10e80 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 50  dPtrSize;.    pP
10e90 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
10ea0 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
10eb0 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43  ];.    pPage->aC
10ec0 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63  ellIdx = &data[c
10ed0 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  ellOffset];.    
10ee0 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
10ef0 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
10f00 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
10f10 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
10f20 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35  F: R-58015-48175
10f30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
10f40 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
10f50 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20  5 designates.   
10f60 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
10f70 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10f80 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
10f90 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
10fa0 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  teger is.    ** 
10fb0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36  interpreted as 6
10fc0 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70  5536. */.    top
10fd0 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
10fe0 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
10ff0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
11000 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32  E-OF: R-37002-32
11010 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65  774 The two-byte
11020 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
11030 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20  et 3 gives the. 
11040 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
11050 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
11060 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d  e. */.    pPage-
11070 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
11080 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
11090 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
110a0 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
110b0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
110c0 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
110d0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
110e0 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
110f0 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
11100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11110 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11120 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
11130 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
11140 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
11150 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
11160 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39  -OF: R-24089-579
11170 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e  79 If a page con
11180 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28  tains no cells (
11190 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20  which is only.  
111a0 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f    ** possible fo
111b0 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  r a root page of
111c0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
111d0 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20  ntains no rows) 
111e0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
111f0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
11200 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
11210 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
11220 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
11230 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20  he.    ** bytes 
11240 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
11250 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
11260 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
11270 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53   || top==usableS
11280 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
11290 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d  B );..    /* A m
112a0 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
112b0 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
112c0 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61  se us to read pa
112d0 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
112e0 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
112f0 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
11300 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
11310 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
11320 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
11330 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
11340 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
11350 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
11360 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
11370 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
11380 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
11390 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
113a0 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
113b0 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
113c0 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
113d0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
113e0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
113f0 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
11400 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66  Size - 4;.    if
11410 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
11420 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
11430 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e  zeCk ){.      in
11440 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
11450 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
11460 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
11470 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e  rray */.      in
11480 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
11490 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
114a0 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  l */..      if( 
114b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
114c0 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
114d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
114e0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
114f0 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65  .        pc = ge
11500 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
11510 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
11520 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
11530 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
11540 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
11550 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
11560 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
11570 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
11580 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
11590 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
115a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
115b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
115c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
115d0 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43    sz = pPage->xC
115e0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
115f0 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
11600 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
11610 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
11620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
11630 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
11640 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
11650 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11660 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
11670 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
11680 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
11690 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
116a0 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20      }  ..    /* 
116b0 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
116c0 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
116d0 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  the page.    ** 
116e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
116f0 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
11700 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
11710 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
11720 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61  s the.    ** sta
11730 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  rt of the first 
11740 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65  freeblock on the
11750 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72   page, or is zer
11760 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  o if there are n
11770 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  o.    ** freeblo
11780 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d  cks. */.    pc =
11790 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
117a0 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
117b0 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
117c0 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
117d0 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
117e0 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
117f0 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63  ce */.    if( pc
11800 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  >0 ){.      u32 
11810 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
11820 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
11830 72 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rst ){.        /
11840 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11850 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20  -55530-52930 In 
11860 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
11870 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65  tree page, there
11880 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   will.        **
11890 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65   always be at le
118a0 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66  ast one cell bef
118b0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66 72  ore the first fr
118c0 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  eeblock..       
118d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
118e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
118f0 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
11900 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20  .      while( 1 
11910 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
11920 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
11930 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11940 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11950 4b 50 54 3b 20 2f 2a 20 46 72 65 65 62 6c 6f 63  KPT; /* Freebloc
11960 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  k off the end of
11970 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
11980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
11990 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
119a0 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
119b0 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
119c0 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
119d0 0a 20 20 20 20 20 20 20 20 6e 46 72 65 65 20 3d  .        nFree =
119e0 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20   nFree + size;. 
119f0 20 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3c         if( next<
11a00 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72 65  =pc+size+3 ) bre
11a10 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  ak;.        pc =
11a20 20 6e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20   next;.      }. 
11a30 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20       if( next>0 
11a40 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
11a50 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11a60 5f 42 4b 50 54 3b 20 20 2f 2a 20 46 72 65 65 62  _BKPT;  /* Freeb
11a70 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65  lock not in asce
11a80 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
11a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11aa0 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e   pc+size>(unsign
11ab0 65 64 20 69 6e 74 29 75 73 61 62 6c 65 53 69 7a  ed int)usableSiz
11ac0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  e ){.        ret
11ad0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11ae0 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 4c 61 73  PT_BKPT;  /* Las
11af0 74 20 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65  t freeblock exte
11b00 6e 64 73 20 70 61 73 74 20 70 61 67 65 20 65 6e  nds past page en
11b10 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
11b20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
11b30 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
11b40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
11b50 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
11b60 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20  o the start.    
11b70 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
11b80 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
11b90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
11ba0 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
11bb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c  .    ** the cell
11bc0 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49  -content area. I
11bd0 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65  f this is greate
11be0 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c  r than the usabl
11bf0 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66  e-size.    ** of
11c00 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
11c10 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  the page must be
11c20 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
11c30 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20   check also.    
11c40 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
11c50 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
11c60 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
11c70 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
11c80 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61  tent.    ** area
11c90 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
11ca0 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
11cb0 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
11cc0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
11cd0 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
11ce0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
11cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11d00 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
11d10 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  }.    pPage->nFr
11d20 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
11d30 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
11d40 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
11d50 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
11d60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11d70 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
11d80 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
11d90 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
11da0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
11db0 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
11dc0 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
11dd0 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
11de0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
11df0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
11e00 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
11e10 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
11e20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11e30 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
11e40 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
11e50 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
11e60 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
11e70 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11e80 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
11e90 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
11ea0 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
11eb0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11ec0 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
11ed0 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
11ee0 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
11ef0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11f00 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
11f10 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
11f20 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
11f30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
11f40 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
11f50 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
11f60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11f70 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11f80 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
11f90 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
11fa0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
11fb0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
11fc0 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
11fd0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
11fe0 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
11ff0 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
12000 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
12010 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   + ((flags&PTF_L
12020 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38  EAF)==0 ? 12 : 8
12030 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
12040 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
12050 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
12060 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
12070 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
12080 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
12090 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
120a0 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
120b0 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
120c0 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
120d0 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
120e0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
120f0 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
12100 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
12110 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
12120 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
12130 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
12140 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
12150 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61  >aDataOfst = &da
12160 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ta[pPage->childP
12170 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  trSize];.  pPage
12180 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
12190 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
121a0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
121b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
121c0 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
121d0 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
121e0 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
121f0 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
12200 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
12210 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
12220 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
12230 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
12240 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
12250 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
12260 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
12270 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
12280 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
12290 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
122a0 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
122b0 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
122c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
122d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
122e0 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
122f0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
12300 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ra(pDbPage);.  i
12310 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e  f( pgno!=pPage->
12320 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
12330 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
12340 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
12350 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61  DbPage);.    pPa
12360 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
12370 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65  bPage;.    pPage
12380 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
12390 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
123a0 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  gno;.    pPage->
123b0 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f  hdrOffset = pgno
123c0 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
123d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
123e0 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  ge->aData==sqlit
123f0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
12400 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
12410 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
12420 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
12430 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
12440 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
12450 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
12460 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
12470 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
12480 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20  ded.  See also: 
12490 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
124a0 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge()..**.** If t
124b0 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  he PAGER_GET_NOC
124c0 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73  ONTENT flag is s
124d0 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
124e0 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
124f0 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f  .** about the co
12500 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
12510 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
12520 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
12530 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
12540 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
12550 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
12560 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
12570 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
12580 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
12590 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
125a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
125b0 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
125c0 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
125d0 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
125e0 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
125f0 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
12600 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
12610 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
12620 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
12630 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
12640 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
12650 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
12660 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
12670 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
12680 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12690 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
126a0 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
126b0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
126c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
126d0 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
126e0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
126f0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
12700 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
12710 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
12720 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
12730 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
12740 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
12750 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
12760 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
12770 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
12780 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
12790 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
127a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
127b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
127c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
127d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
127e0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
127f0 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
12800 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29  &pDbPage, flags)
12810 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
12820 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
12830 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
12840 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
12850 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
12860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
12880 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
12890 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
128a0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
128b0 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
128c0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
128d0 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
128e0 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
128f0 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
12900 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
12910 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
12920 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
12930 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
12940 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
12950 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
12960 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
12970 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
12980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12990 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
129a0 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
129b0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
129c0 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
129d0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
129e0 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
129f0 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
12a00 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
12a10 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
12a20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
12a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12a40 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12a50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12a60 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
12a70 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
12a80 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
12a90 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
12aa0 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
12ab0 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
12ac0 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
12ad0 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
12ae0 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
12af0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
12b00 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
12b10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12b20 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
12b30 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
12b40 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
12b50 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29  &0x8000000)==0 )
12b60 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
12b70 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
12b80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
12b90 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
12ba0 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
12bb0 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  lize it..**.** I
12bc0 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74  f pCur!=0 then t
12bd0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
12be0 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74   fetched as part
12bf0 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   of a moveToChil
12c00 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f  d().** call.  Do
12c10 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
12c20 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
12c30 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
12c40 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20  case..** And if 
12c50 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c  the fetch fails,
12c60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   this routine mu
12c70 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75  st decrement pCu
12c80 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  r->iPage..**.** 
12c90 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63  The page is fetc
12ca0 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74  hed as read-writ
12cb0 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73  e unless pCur is
12cc0 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73   not NULL and is
12cd0 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  .** a read-only 
12ce0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
12cf0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12d00 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
12d10 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
12d20 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
12d30 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
12d40 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
12d50 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
12d60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
12d70 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
12d80 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12da0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
12db0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
12dc0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
12dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12de0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
12df0 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
12e00 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
12e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
12e20 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
12e30 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42  nter here */.  B
12e40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e60 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65  * Cursor to rece
12e70 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72  ive the page, or
12e80 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62   NULL */.  int b
12e90 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20  ReadOnly        
12ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
12eb0 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
12ec0 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ly page */.){.  
12ed0 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
12ee0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
12ef0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12f00 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
12f10 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12f20 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61   pCur==0 || ppPa
12f30 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67  ge==&pCur->apPag
12f40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
12f50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
12f60 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79  ==0 || bReadOnly
12f70 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  ==pCur->curPager
12f80 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72  Flags );.  asser
12f90 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43  t( pCur==0 || pC
12fa0 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a  ur->iPage>0 );..
12fb0 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65    if( pgno>btree
12fc0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
12fd0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12fe0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
12ff0 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
13000 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
13010 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
13020 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
13030 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
13040 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
13050 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69   bReadOnly);.  i
13060 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  f( rc ){.    got
13070 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
13080 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70  _error;.  }.  *p
13090 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
130a0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
130b0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
130c0 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
130d0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
130e0 20 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d     btreePageFrom
130f0 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
13100 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20  pgno, pBt);.    
13110 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
13120 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
13130 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13140 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
13150 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
13160 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74  ;.      goto get
13170 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
13180 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  r;.    }.  }.  a
13190 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
131a0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
131b0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
131c0 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69  ge)->aData==sqli
131d0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
131e0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
131f0 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61  * If obtaining a
13200 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20   child page for 
13210 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73  a cursor, we mus
13220 74 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  t verify that th
13230 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63  e page is.  ** c
13240 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
13250 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f  he root page. */
13260 0a 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28  .  if( pCur && (
13270 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c  (*ppPage)->nCell
13280 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  <1 || (*ppPage)-
13290 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63  >intKey!=pCur->c
132a0 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20  urIntKey) ){.   
132b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
132c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
132d0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
132e0 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  ge);.    goto ge
132f0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
13300 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
13310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74   SQLITE_OK;..get
13320 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
13330 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 20  r:.  if( pCur ) 
13340 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
13350 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
13360 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13370 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
13380 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
13390 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
133a0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
133b0 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
133c0 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
133d0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
133e0 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
133f0 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
13400 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
13410 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
13420 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
13430 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13440 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
13450 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
13460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13470 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
13480 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13490 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
134a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
134b0 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
134c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
134d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
134e0 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
134f0 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
13500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13510 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13520 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
13530 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  x) );.  sqlite3P
13540 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
13550 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
13560 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13570 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
13580 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
13590 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61  f( pPage ) relea
135a0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
135b0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age);.}../*.** G
135c0 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67  et an unused pag
135d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  e..**.** This wo
135e0 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74  rks just like bt
135f0 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74  reeGetPage() wit
13600 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a  h the addition:.
13610 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68  **.**   *  If th
13620 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
13630 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d  y in use for som
13640 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c  e other purpose,
13650 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
13660 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20       release it 
13670 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
13680 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72  LITE_CURRUPT err
13690 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65  or..**   *  Make
136a0 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74   sure the isInit
136b0 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a   flag is clear.*
136c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
136d0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
136e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
136f0 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
13700 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
13710 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
13720 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
13730 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
13740 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
13750 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
13760 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
13770 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
13780 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
13790 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
137a0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
137b0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
137c0 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
137d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
137e0 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
137f0 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
13800 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13810 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
13820 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
13830 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
13840 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
13850 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13860 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
13870 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
13880 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13890 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
138a0 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
138b0 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
138c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
138d0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
138e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
138f0 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
13900 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
13910 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
13920 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
13930 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
13940 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
13950 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
13960 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
13970 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
13980 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
13990 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
139a0 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
139b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
139c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
139d0 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
139e0 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
139f0 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
13a00 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
13a10 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
13a20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
13a30 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
13a40 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
13a50 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
13a60 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
13a70 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
13a80 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
13a90 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
13aa0 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
13ab0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13ac0 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
13ad0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
13ae0 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
13af0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13b00 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
13b10 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
13b20 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
13b30 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
13b40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13b50 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
13b60 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
13b70 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
13b80 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
13b90 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
13ba0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
13bb0 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
13bc0 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
13bd0 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
13be0 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
13bf0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
13c00 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
13c10 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
13c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13c30 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
13c40 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
13c50 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
13c60 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
13c70 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
13c80 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
13c90 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
13ca0 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
13cb0 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
13cc0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
13cd0 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
13ce0 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
13cf0 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
13d00 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
13d10 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
13d20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13d30 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
13d40 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
13d50 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
13d60 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
13d70 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
13d80 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
13d90 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
13da0 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
13db0 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
13dc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13dd0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
13de0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
13df0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
13e00 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13e10 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
13e20 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
13e30 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
13e40 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
13e50 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
13e60 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
13e70 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
13e80 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
13e90 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65  .** then an ephe
13ea0 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69  meral database i
13eb0 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
13ec0 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
13ed0 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65  se might.** be e
13ee0 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65  xclusively in me
13ef0 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  mory, or it migh
13f00 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73  t use a disk-bas
13f10 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  ed memory cache.
13f20 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20  .** Either way, 
13f30 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  the ephemeral da
13f40 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61  tabase will be a
13f50 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
13f60 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71  eted .** when sq
13f70 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
13f80 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
13f90 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
13fa0 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
13fb0 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
13fc0 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
13fd0 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
13fe0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
13ff0 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
14000 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
14010 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61  The "flags" para
14020 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
14030 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  sk that might co
14040 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a  ntain bits like.
14050 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  ** BTREE_OMIT_JO
14060 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52  URNAL and/or BTR
14070 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  EE_MEMORY..**.**
14080 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
14090 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
140a0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
140b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
140c0 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
140d0 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
140e0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
140f0 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
14100 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
14110 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
14120 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
14130 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
14140 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
14150 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
14160 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14170 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
14180 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
14190 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
141a0 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
141b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
141c0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
141d0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
141e0 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
141f0 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  his b-tree */.  
14200 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
14210 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
14220 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
14230 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
14240 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
14250 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
14260 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
14270 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
14280 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
14290 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
142a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
142b0 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
142c0 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
142d0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
142e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
142f0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
14300 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
14310 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
14320 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
14330 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
14340 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  ) */.){.  BtShar
14350 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
14360 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
14370 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
14380 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
14390 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
143b0 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
143c0 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
143d0 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
143e0 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
143f0 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
14400 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
14410 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
14420 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
14430 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
14440 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
14450 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
14460 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
14470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
14480 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
14490 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
144a0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
144b0 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
144c0 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
144d0 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
144e0 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66  */..  /* True if
144f0 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65   opening an ephe
14500 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79  meral, temporary
14510 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
14520 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44  onst int isTempD
14530 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  b = zFilename==0
14540 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
14550 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ==0;..  /* Set t
14560 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
14570 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
14580 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
14590 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
145a0 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
145b0 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
145c0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
145d0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
145e0 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  B.  const int is
145f0 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65  Memdb = 0;.#else
14600 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
14610 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d  emdb = (zFilenam
14620 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c  e && strcmp(zFil
14630 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
14640 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  ")==0).         
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
14660 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71   (isTempDb && sq
14670 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
14680 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20  y(db)).         
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
146a0 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
146b0 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
146c0 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  !=0;.#endif..  a
146d0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
146e0 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
146f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
14700 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14710 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
14720 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
14730 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
14740 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
14750 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
14760 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
14770 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
14780 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
14790 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
147a0 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
147b0 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
147c0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
147d0 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
147e0 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
147f0 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
14800 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
14810 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
14820 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
14830 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
14840 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
14850 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
14860 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
14870 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45    flags |= BTREE
14880 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69  _MEMORY;.  }.  i
14890 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  f( (vfsFlags & S
148a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
148b0 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d  DB)!=0 && (isMem
148c0 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20  db || isTempDb) 
148d0 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20  ){.    vfsFlags 
148e0 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53  = (vfsFlags & ~S
148f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
14900 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  DB) | SQLITE_OPE
14910 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20  N_TEMP_DB;.  }. 
14920 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
14930 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
14940 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
14950 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14960 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14970 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
14980 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
14990 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69    p->db = db;.#i
149a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
149b0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
149c0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20   p->lock.pBtree 
149d0 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69  = p;.  p->lock.i
149e0 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69  Table = 1;.#endi
149f0 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
14a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14a10 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14a20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14a30 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
14a40 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
14a50 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
14a60 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
14a70 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
14a80 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
14a90 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
14aa0 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
14ab0 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
14ac0 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26  ( isTempDb==0 &&
14ad0 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20   (isMemdb==0 || 
14ae0 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
14af0 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29  _OPEN_URI)!=0) )
14b00 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
14b10 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
14b20 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
14b30 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
14b40 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
14b50 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
14b60 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  +1;.      int nF
14b70 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
14b80 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
14b90 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
14ba0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
14bb0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28  lite3Malloc(MAX(
14bc0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46  nFullPathname,nF
14bd0 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ilename));.     
14be0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
14bf0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
14c00 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20  exShared; )..   
14c10 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
14c20 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
14c30 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
14c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14c50 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
14c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14c70 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
14c80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d   }.      if( isM
14c90 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
14ca0 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68  memcpy(zFullPath
14cb0 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  name, zFilename,
14cc0 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   nFilename);.   
14cd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14cf0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
14d00 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
14d40 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
14d50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
14d60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
14d70 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
14d80 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
14d90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14da0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
14db0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
14dc0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
14dd0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
14de0 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
14df0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
14e00 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
14e10 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
14e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14e30 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
14e40 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
14e50 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
14e60 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14e70 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14e80 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
14e90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14ea0 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
14eb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
14ec0 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
14ed0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
14ee0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
14ef0 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
14f00 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
14f10 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
14f20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
14f30 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
14f40 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
14f50 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
14f60 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
14f90 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
14fa0 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
14fb0 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
14fc0 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
14fd0 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
14fe0 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
14ff0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
15000 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
15010 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
15020 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
15030 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
15040 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15060 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15070 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15090 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
150a0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
150b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
150c0 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
150d0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
150e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
150f0 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
15100 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15110 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
15120 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15140 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
15150 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
15160 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
15170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15180 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15190 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
151a0 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
151b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
151c0 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
151d0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
151e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
151f0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
15200 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
15210 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
15220 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
15230 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
15240 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
15250 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
15260 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
15270 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
15280 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
15290 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
152a0 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
152b0 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
152c0 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
152d0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
152e0 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
152f0 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
15300 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
15310 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
15320 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
15330 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
15340 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
15350 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
15360 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
15370 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
15380 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
15390 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
153a0 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
153b0 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
153c0 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
153d0 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
153e0 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
153f0 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
15400 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
15410 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
15420 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
15430 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
15440 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b  izeof(u64)==8 );
15450 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
15460 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
15470 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15480 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
15490 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
154a0 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
154b0 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
154c0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
154d0 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
154e0 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
154f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15500 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
15510 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
15520 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
15530 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15540 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
15550 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
15560 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c  sizeof(MemPage),
15590 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
155a0 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
155b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
155c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
155d0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
155e0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
155f0 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
15600 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15610 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
15620 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
15630 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
15640 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
15650 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
15660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15670 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
15680 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
15690 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
156a0 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
156b0 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
156c0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
156d0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
156e0 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
156f0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
15700 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
15710 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
15720 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
15730 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
15740 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
15750 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
15760 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
15770 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
15780 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
15790 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
157a0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
157b0 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
157c0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
157d0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
157e0 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49  endif.    /* EVI
157f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
15800 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
15810 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
15820 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
15830 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
15840 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
15850 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
15860 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
15870 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
15880 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
15890 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
158a0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74  file. */.    pBt
158b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
158c0 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
158d0 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
158e0 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
158f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
15900 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
15910 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
15920 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
15930 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
15940 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
15950 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
15960 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
15970 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
15980 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
15990 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
159a0 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
159b0 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
159c0 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
159d0 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
159e0 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
159f0 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
15a00 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
15a10 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
15a20 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
15a30 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
15a40 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
15a50 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
15a60 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
15a70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
15a80 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
15a90 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
15aa0 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
15ab0 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
15ac0 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
15ad0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
15ae0 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
15af0 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
15b00 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
15b10 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
15b20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
15b30 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
15b40 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
15b50 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
15b60 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
15b70 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
15b80 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
15b90 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
15ba0 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
15bb0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
15bc0 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
15bd0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
15be0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
15bf0 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
15c00 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
15c10 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
15c20 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  n is.      ** de
15c30 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
15c40 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
15c50 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
15c60 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
15c70 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  20.      ** into
15c80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15c90 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
15ca0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
15cb0 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
15cc0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
15cd0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
15ce0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
15cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15d00 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
15d10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
15d20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
15d30 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
15d40 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
15d50 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
15d60 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
15d70 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
15d80 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
15d90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15da0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
15db0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
15dc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
15dd0 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
15de0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
15df0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
15e00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
15e10 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
15e20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
15e30 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
15e40 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
15e50 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
15e60 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
15e70 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
15e80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15e90 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
15ea0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
15eb0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
15ec0 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
15ed0 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
15ee0 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
15ef0 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
15f00 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
15f10 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20  /.    pBt->nRef 
15f20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 1;.    if( p->
15f30 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
15f40 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
15f50 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
15f60 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
15f70 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
15f80 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
15f90 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15fa0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15fb0 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20  TIC_MASTER);).  
15fc0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
15fd0 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
15fe0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15ff0 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
16000 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
16010 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
16020 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
16030 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
16040 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
16050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
16070 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
16080 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
16090 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
160a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
160b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
160c0 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
160d0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
160e0 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
160f0 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
16100 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
16110 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
16120 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
16130 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
16140 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
16150 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
16160 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
16170 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
16180 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
16190 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
161a0 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
161b0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
161c0 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
161d0 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
161e0 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
161f0 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
16200 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
16210 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
16220 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
16230 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
16240 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
16250 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
16260 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
16270 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
16280 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
16290 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
162a0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
162b0 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
162c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
162d0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
162e0 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
162f0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
16300 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
16310 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
16320 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
16330 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
16340 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
16350 20 20 20 20 20 69 66 28 20 28 75 70 74 72 29 70       if( (uptr)p
16360 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69 62  ->pBt<(uptr)pSib
16370 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
16380 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
16390 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
163a0 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
163b0 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
163c0 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
163d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
163e0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
163f0 78 74 20 26 26 20 28 75 70 74 72 29 70 53 69 62  xt && (uptr)pSib
16400 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70  ->pNext->pBt<(up
16410 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  tr)p->pBt ){.   
16420 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
16430 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
16440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16450 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
16460 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
16470 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
16480 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
16490 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
164a0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
164b0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
164c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
164d0 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
164e0 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
164f0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
16500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16510 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
16520 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
16530 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
16540 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16550 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
16560 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
16570 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
16580 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
16590 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
165a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
165b0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
165c0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
165d0 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
165e0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
165f0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a  3_file *pFile;..
16600 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
16610 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
16620 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
16630 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
16640 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
16650 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
16660 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
16670 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
16680 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
16690 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
166a0 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
166b0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
166c0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
166d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
166e0 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
166f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
16700 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
16710 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
16720 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
16730 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
16740 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46  );.    }..    pF
16750 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
16760 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
16770 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  er);.    if( pFi
16780 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  le->pMethods ){.
16790 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
167a0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
167b0 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  File, SQLITE_FCN
167c0 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26  TL_PDB, (void*)&
167d0 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a  pBt->db);.    }.
167e0 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
167f0 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
16800 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16810 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
16820 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
16830 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
16840 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73  xOpen);.  }.  as
16850 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
16860 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  _OK || sqlite3Bt
16870 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75  reeConnectionCou
16880 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29  nt(*ppBtree)>0 )
16890 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
168a0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
168b0 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
168c0 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
168d0 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
168e0 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
168f0 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
16900 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
16910 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
16920 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
16930 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
16940 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
16950 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
16960 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
16970 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
16980 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16990 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
169a0 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
169b0 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
169c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
169d0 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f  D_CACHE.  MUTEX_
169e0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
169f0 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
16a00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
16a10 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
16a20 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
16a30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16a40 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
16a50 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c  ex) );.  MUTEX_L
16a60 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
16a70 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
16a80 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
16a90 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
16aa0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16ab0 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
16ac0 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
16ad0 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
16ae0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
16af0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
16b00 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
16b10 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
16b20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
16b30 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
16b40 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
16b50 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
16b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
16b70 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
16b80 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
16b90 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
16ba0 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
16bb0 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
16bc0 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
16bd0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
16be0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
16bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16c00 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
16c10 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
16c20 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
16c30 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
16c40 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
16c50 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
16c60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
16c70 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
16c80 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
16c90 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
16ca0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16cb0 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
16cc0 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
16cd0 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
16ce0 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
16cf0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
16d00 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
16d10 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
16d20 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
16d30 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
16d40 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79 74  tes with a 4-byt
16d50 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c  e prefix for a l
16d60 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69  eft-child.** poi
16d70 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
16d80 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
16d90 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
16da0 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
16db0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
16dc0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16dd0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
16de0 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
16df0 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  eSize );..    /*
16e00 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73   One of the uses
16e10 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61   of pBt->pTmpSpa
16e20 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20  ce is to format 
16e30 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20  cells before.   
16e40 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68   ** inserting th
16e50 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70  em into a leaf p
16e60 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69  age (function fi
16e70 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a  llInCell()). If.
16e80 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73      ** a cell is
16e90 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74   less than 4 byt
16ea0 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69  es in size, it i
16eb0 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  s rounded up to 
16ec0 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62  4 bytes.    ** b
16ed0 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  y the various ro
16ee0 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69  utines that mani
16ef0 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65  pulate binary ce
16f00 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a  lls. Which.    *
16f10 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20  * can mean that 
16f20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
16f30 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  y initializes th
16f40 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20  e first 2 or 3. 
16f50 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
16f60 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68  TmpSpace, but th
16f70 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62  at the first 4 b
16f80 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20  ytes are copied 
16f90 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69  from.    ** it i
16fa0 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70  nto a database p
16fb0 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  age. This is not
16fc0 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62   actually a prob
16fd0 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20  lem, but it.    
16fe0 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20  ** does cause a 
16ff0 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77  valgrind error w
17000 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62  hen the 1 or 2 b
17010 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69  ytes of unitiali
17020 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  zed .    ** data
17030 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79   is passed to sy
17040 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28  stem call write(
17050 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74  ). So to avoid t
17060 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a  his error,.    *
17070 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  * zero the first
17080 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70   4 bytes of temp
17090 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20   space here..   
170a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a   **.    ** Also:
170b0 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62    Provide four b
170c0 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69  ytes of initiali
170d0 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72 65  zed space before
170e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69   the.    ** begi
170f0 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61  nning of pTmpSpa
17100 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61 76  ce as an area av
17110 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65  ailable to prepe
17120 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65  nd the.    ** le
17130 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ft-child pointer
17140 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
17150 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20  g of a cell..   
17160 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
17170 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
17180 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e      memset(pBt->
17190 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29  pTmpSpace, 0, 8)
171a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d  ;.      pBt->pTm
171b0 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20  pSpace += 4;.   
171c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
171d0 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54  Free the pBt->pT
171e0 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69  mpSpace allocati
171f0 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
17200 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28  d freeTempSpace(
17210 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
17220 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
17230 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
17240 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b  >pTmpSpace -= 4;
17250 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
17260 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70  Free(pBt->pTmpSp
17270 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ace);.    pBt->p
17280 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20  TmpSpace = 0;.  
17290 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
172a0 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
172b0 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
172c0 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
172d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
172e0 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
172f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
17300 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
17310 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
17320 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
17330 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
17340 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
17350 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
17360 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17370 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
17380 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17390 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d  ter(p);.  pCur =
173a0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
173b0 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
173c0 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
173d0 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
173e0 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
173f0 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
17400 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
17410 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17420 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
17430 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17440 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
17450 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
17460 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
17470 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
17480 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
17490 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
174a0 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
174b0 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
174c0 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
174d0 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
174e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
174f0 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f  lback(p, SQLITE_
17500 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
17510 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17520 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
17530 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
17540 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
17550 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
17560 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
17570 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
17580 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
17590 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
175a0 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
175b0 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
175c0 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
175d0 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
175e0 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
175f0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
17600 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
17610 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
17620 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
17630 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
17640 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
17650 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
17660 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
17670 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
17680 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
17690 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
176a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
176b0 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
176c0 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
176d0 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
176e0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
176f0 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
17700 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
17710 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
17720 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  b);.    if( pBt-
17730 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
17740 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
17750 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
17760 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
17770 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
17780 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
17790 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a   pBt->pSchema);.
177a0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
177b0 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
177c0 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
177d0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
177e0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
177f0 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
17800 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
17810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17820 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
17830 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
17840 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
17850 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
17860 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
17870 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
17880 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
17890 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
178a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
178b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
178c0 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22  hange the "soft"
178d0 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
178e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
178f0 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55   the cache..** U
17900 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69  nused and unmodi
17910 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20  fied pages will 
17920 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e  be recycled when
17930 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
17940 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  * pages in the c
17950 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68 69  ache exceeds thi
17960 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42  s soft limit.  B
17970 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ut the size of t
17980 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61  he.** cache is a
17990 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c  llowed to grow l
179a0 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
179b0 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74  limit if it cont
179c0 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61  ains.** dirty pa
179d0 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74 69  ges or pages sti
179e0 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73 65  ll in active use
179f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17a00 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
17a10 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
17a20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
17a30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17a40 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
17a50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17a60 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
17a70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17a80 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
17a90 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
17aa0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
17ab0 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
17ac0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17ad0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17ae0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
17af0 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c  hange the "spill
17b00 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
17b10 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17b20 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
17b30 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
17b40 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20 74   pages exceeds t
17b50 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67  his limit during
17b60 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
17b70 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67  tion,.** the pag
17b80 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74  er might attempt
17b90 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65   to "spill" page
17ba0 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
17bb0 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64   early in.** ord
17bc0 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
17bd0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
17be0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
17bf0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  s the current sp
17c00 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65  ill size.  If ze
17c10 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20  ro is passed.** 
17c20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20  as an argument, 
17c30 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
17c40 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c  ade to the spill
17c50 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73   size setting, s
17c60 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67  o.** using mxPag
17c70 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79 20  e of 0 is a way 
17c80 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72  to query the cur
17c90 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e  rent spill size.
17ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17cb0 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65  treeSetSpillSize
17cc0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
17cd0 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
17ce0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17cf0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
17d00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17d10 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
17d20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
17d30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17d40 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  );.  res = sqlit
17d50 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73  e3PagerSetSpills
17d60 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
17d70 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
17d80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17d90 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
17da0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
17db0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
17dc0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
17dd0 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75  imit on the amou
17de0 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nt of the databa
17df0 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79  se file that may
17e00 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61   be.** memory ma
17e10 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pped..*/.int sql
17e20 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70  ite3BtreeSetMmap
17e30 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20  Limit(Btree *p, 
17e40 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
17e50 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65  Mmap){.  BtShare
17e60 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17e70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17e80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
17e90 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
17ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17eb0 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
17ec0 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
17ed0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73  t(pBt->pPager, s
17ee0 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  zMmap);.  sqlite
17ef0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17f00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17f10 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
17f20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
17f30 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
17f40 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
17f50 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
17f60 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
17f70 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
17f80 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
17f90 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
17fa0 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
17fb0 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
17fc0 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
17fd0 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
17fe0 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
17ff0 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
18000 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
18010 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
18020 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
18030 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
18040 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
18050 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
18060 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
18070 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
18080 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
18090 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
180a0 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
180b0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
180c0 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
180d0 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
180e0 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
180f0 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
18100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
18110 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
18120 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
18130 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65  gerFlags(.  Btre
18140 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
18150 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
18160 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74  to set the safet
18170 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20  y level on */.  
18180 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
18190 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
181a0 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20  s PAGER_* flags 
181b0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
181c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
181d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
181e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
181f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
18200 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18210 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
18220 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
18230 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67  ->pPager, pgFlag
18240 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
18250 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18270 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18280 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
18290 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
182a0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
182b0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
182c0 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
182d0 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
182e0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
182f0 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
18300 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
18310 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
18320 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
18330 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
18340 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
18350 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
18360 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
18370 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
18380 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
18390 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
183a0 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
183b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
183c0 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
183d0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
183e0 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
183f0 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
18400 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
18410 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
18420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18430 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
18440 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
18450 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
18460 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
18470 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
18480 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
18490 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
184a0 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
184b0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
184c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
184d0 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
184e0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
184f0 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
18500 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
18510 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
18520 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
18530 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
18540 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
18550 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
18560 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
18570 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
18580 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
18590 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
185a0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
185b0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
185c0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
185d0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
185e0 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
185f0 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
18600 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
18610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
18620 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18630 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
18640 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
18650 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
18660 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18670 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c  nter(p);.#if SQL
18680 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
18690 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74  if( nReserve>pBt
186a0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
186b0 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52   ) pBt->optimalR
186c0 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65  eserve = (u8)nRe
186d0 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
186e0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
186f0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
18700 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
18710 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18720 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
18730 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
18740 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
18750 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
18760 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
18770 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
18780 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
18790 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
187a0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
187b0 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
187c0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
187d0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
187e0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
187f0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
18800 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
18810 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
18820 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
18830 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
18840 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
18850 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
18860 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
18870 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
18880 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
18890 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
188a0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
188b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
188c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
188d0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
188e0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
188f0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
18900 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
18910 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
18920 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
18930 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
18940 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18950 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
18960 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
18970 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
18980 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
18990 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
189a0 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
189b0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
189c0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
189d0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
189e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
189f0 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
18a00 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
18a10 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
18a20 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
18a30 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
18a40 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
18a50 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
18a60 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
18a70 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
18a80 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
18a90 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
18aa0 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
18ab0 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
18ac0 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
18ad0 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
18ae0 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
18af0 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
18b00 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
18b10 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
18b20 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
18b30 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
18b40 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
18b50 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
18b60 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
18b70 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
18b80 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
18b90 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
18ba0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
18bb0 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
18bc0 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
18bd0 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
18be0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
18bf0 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
18c00 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
18c10 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t n;.  assert( s
18c20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18c30 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
18c40 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74   );.  n = p->pBt
18c50 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
18c60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
18c70 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
18c80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18c90 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18ca0 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
18cb0 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
18cc0 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
18cd0 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
18ce0 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
18cf0 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
18d00 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
18d10 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
18d20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
18d30 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48  *.** If SQLITE_H
18d40 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69  AS_MUTEX is defi
18d50 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ned then the num
18d60 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ber returned is 
18d70 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f  the.** greater o
18d80 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  f the current re
18d90 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64  served space and
18da0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71   the maximum req
18db0 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76  uested.** reserv
18dc0 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  e space..*/.int 
18dd0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f  sqlite3BtreeGetO
18de0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74  ptimalReserve(Bt
18df0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
18e00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18e10 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
18e20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
18e30 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29  eserveNoMutex(p)
18e40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18e50 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
18e60 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  n<p->pBt->optima
18e70 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70  lReserve ) n = p
18e80 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
18e90 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
18ea0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18eb0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
18ec0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
18ed0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
18ee0 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
18ef0 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
18f00 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
18f10 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
18f20 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
18f30 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
18f40 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
18f50 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
18f60 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
18f70 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
18f80 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
18f90 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
18fa0 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
18fb0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
18fc0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
18fd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
18fe0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
18ff0 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
19000 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
19010 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
19020 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
19030 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
19040 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45  * Set the BTS_SE
19050 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67  CURE_DELETE flag
19060 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30   if newFlag is 0
19070 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c   or 1.  If newFl
19080 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65  ag is -1,.** the
19090 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  n make no change
190a0 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  s.  Always retur
190b0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
190c0 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
190d0 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20  LETE.** setting 
190e0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
190f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19100 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
19110 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
19120 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
19130 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
19140 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
19150 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19160 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
19170 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
19180 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
19190 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
191a0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61  ;.    if( newFla
191b0 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46  g ) p->pBt->btsF
191c0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
191d0 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a  RE_DELETE;.  } .
191e0 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
191f0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
19200 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b  CURE_DELETE)!=0;
19210 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19220 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19230 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
19240 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
19250 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
19260 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
19270 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
19280 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
19290 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
192a0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
192b0 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
192c0 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
192d0 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
192e0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
192f0 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
19300 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
19310 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
19320 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
19330 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
19340 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
19350 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
19360 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
19370 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
19380 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
19390 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
193a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
193b0 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
193c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
193d0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
193e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
193f0 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
19400 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
19410 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19420 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
19430 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
19440 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
19450 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
19460 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
19470 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19480 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
19490 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
194a0 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
194b0 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
194c0 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
194d0 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
194e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
194f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
19500 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
19510 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
19520 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
19530 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
19540 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
19550 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
19560 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
19570 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
19580 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
19590 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
195a0 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
195b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
195c0 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
195d0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
195e0 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
195f0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
19600 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
19610 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
19620 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
19630 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
19640 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
19650 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
19660 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
19670 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
19680 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
19690 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
196a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
196b0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
196c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
196d0 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65   user has not se
196e0 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  t the safety-lev
196f0 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  el for this data
19700 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
19710 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41  ** using "PRAGMA
19720 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61   synchronous", a
19730 6e 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79  nd if the safety
19740 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c  -level is not al
19750 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20  ready.** set to 
19760 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
19770 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
19780 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  n as the second 
19790 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65  parameter,.** se
197a0 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20  t it so..*/.#if 
197b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
197c0 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49  YNCHRONOUS!=SQLI
197d0 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
197e0 59 4e 43 48 52 4f 4e 4f 55 53 0a 73 74 61 74 69  YNCHRONOUS.stati
197f0 63 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c  c void setDefaul
19800 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72  tSyncFlag(BtShar
19810 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65  ed *pBt, u8 safe
19820 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c  ty_level){.  sql
19830 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
19840 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70  pDb;.  if( (db=p
19850 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70  Bt->db)!=0 && (p
19860 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29  Db=db->aDb)!=0 )
19870 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  {.    while( pDb
19880 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d  ->pBt==0 || pDb-
19890 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29  >pBt->pBt!=pBt )
198a0 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69  { pDb++; }.    i
198b0 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74  f( pDb->bSyncSet
198c0 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62  ==0 .     && pDb
198d0 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ->safety_level!=
198e0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20  safety_level .  
198f0 20 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e     && pDb!=&db->
19900 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20  aDb[1] .    ){. 
19910 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
19920 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f  _level = safety_
19930 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c  level;.      sql
19940 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
19950 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20  s(pBt->pPager,. 
19960 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61           pDb->sa
19970 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62  fety_level | (db
19980 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ->flags & PAGER_
19990 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20  FLAGS_MASK));.  
199a0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
199b0 23 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61  # define setDefa
199c0 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c  ultSyncFlag(pBt,
199d0 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65  safety_level).#e
199e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ndif../*.** Get 
199f0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
19a00 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
19a10 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
19a20 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
19a30 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
19a40 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
19a50 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
19a60 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
19a70 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
19a80 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
19a90 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
19aa0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
19ab0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
19ac0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
19ad0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
19ae0 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
19af0 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
19b00 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
19b10 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
19b20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
19b30 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
19b40 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
19b50 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
19b60 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
19b70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
19b80 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
19b90 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
19ba0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
19bb0 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
19bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19bd0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
19be0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
19bf0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
19c00 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
19c10 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
19c20 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
19c30 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
19c40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19c50 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
19c60 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
19c70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19c80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
19c90 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
19ca0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
19cb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19cc0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19cd0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
19ce0 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
19cf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
19d00 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
19d10 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
19d20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
19d30 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
19d40 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
19d50 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
19d60 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19d70 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
19d80 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
19d90 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
19da0 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
19db0 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
19dc0 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
19dd0 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
19de0 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
19df0 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
19e00 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
19e10 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
19e20 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
19e30 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
19e40 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
19e50 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
19e60 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
19e70 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
19e80 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
19e90 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
19ea0 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
19eb0 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
19ec0 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
19ed0 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
19ee0 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
19ef0 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
19f00 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
19f10 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
19f20 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f  TE_NOTADB;.    /
19f30 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19f40 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65  -43737-39999 Eve
19f50 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20  ry valid SQLite 
19f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
19f70 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  gins.    ** with
19f80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31   the following 1
19f90 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29  6 bytes (in hex)
19fa0 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34  : 53 51 4c 69 74
19fb0 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20   65 20 66 6f 72 
19fc0 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20  6d.    ** 61 74 
19fd0 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20  20 33 00. */.   
19fe0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
19ff0 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
1a000 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
1a010 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a020 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
1a030 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1a040 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
1a050 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
1a060 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1a070 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
1a080 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
1a090 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
1a0a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1a0b0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1a0c0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
1a0d0 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
1a0e0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
1a0f0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
1a100 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
1a110 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
1a120 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
1a130 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1a140 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
1a150 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
1a160 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
1a170 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
1a180 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
1a190 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
1a1a0 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
1a1b0 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
1a1c0 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
1a1d0 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
1a1e0 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
1a1f0 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
1a200 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
1a210 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
1a220 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
1a230 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
1a240 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
1a250 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
1a260 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
1a270 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
1a280 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
1a290 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
1a2a0 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
1a2b0 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
1a2c0 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
1a2d0 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
1a2e0 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
1a2f0 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
1a300 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
1a310 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
1a320 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
1a330 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
1a340 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
1a350 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
1a360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a370 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
1a380 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
1a390 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
1a3a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a3b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
1a3c0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1a3d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a3e0 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
1a3f0 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
1a400 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
1a410 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a  SYNCHRONOUS+1);.
1a420 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70          if( isOp
1a430 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
1a440 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1a450 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
1a460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a470 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
1a480 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1a490 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
1a4a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a4b0 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
1a4c0 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
1a4d0 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
1a4e0 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65  OUS+1);.    }.#e
1a4f0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49  ndif..    /* EVI
1a500 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36  DENCE-OF: R-1546
1a510 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69  5-20813 The maxi
1a520 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20  mum and minimum 
1a530 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
1a540 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e  .    ** fraction
1a550 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70  s and the leaf p
1a560 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20  ayload fraction 
1a570 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36  values must be 6
1a580 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20  4, 32, and 32.. 
1a590 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1a5a0 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
1a5b0 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
1a5c0 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
1a5d0 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
1a5e0 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
1a5f0 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
1a600 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
1a610 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
1a620 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
1a630 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
1a640 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
1a650 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1a660 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
1a670 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a680 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
1a690 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
1a6a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a6b0 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
1a6c0 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
1a6d0 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
1a6e0 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
1a6f0 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
1a700 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
1a710 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
1a720 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1a730 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61    pageSize = (pa
1a740 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70  ge1[16]<<8) | (p
1a750 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  age1[17]<<16);. 
1a760 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a770 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38  F: R-25008-21688
1a780 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70   The size of a p
1a790 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f  age is a power o
1a7a0 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74  f two.    ** bet
1a7b0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
1a7c0 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f  36 inclusive. */
1a7d0 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
1a7e0 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
1a7f0 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  !=0.     || page
1a800 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
1a810 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20  PAGE_SIZE .     
1a820 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36  || pageSize<=256
1a830 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
1a840 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1a850 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1a860 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
1a870 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
1a880 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a890 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20  : R-59310-51205 
1a8a0 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70  The "reserved sp
1a8b0 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65  ace" size in the
1a8c0 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69   1-byte.    ** i
1a8d0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
1a8e0 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65   20 is the numbe
1a8f0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
1a900 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
1a910 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61  f.    ** each pa
1a920 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  ge to reserve fo
1a930 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20  r extensions. . 
1a940 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49     **.    ** EVI
1a950 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
1a960 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
1a970 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
1a980 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a   region is.    *
1a990 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
1a9a0 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73  the one-byte uns
1a9b0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f  igned integer fo
1a9c0 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  und at an offset
1a9d0 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e   of 20.    ** in
1a9e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1a9f0 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
1aa00 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
1aa10 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
1aa20 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
1aa30 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
1aa40 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
1aa50 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
1aa60 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
1aa70 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
1aa80 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
1aa90 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
1aaa0 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
1aab0 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
1aac0 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
1aad0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
1aae0 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
1aaf0 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
1ab00 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
1ab10 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
1ab20 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
1ab30 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
1ab40 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
1ab50 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
1ab60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
1ab70 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
1ab80 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
1ab90 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
1aba0 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
1abb0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1abc0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1abd0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1abe0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
1abf0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1ac00 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
1ac10 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
1ac20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ac30 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1ac40 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
1ac50 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ac80 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
1ac90 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
1aca0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1acb0 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
1acc0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
1acd0 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
1ace0 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
1acf0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1ad00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ad10 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
1ad20 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1ad30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
1ad40 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
1ad50 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65  312-64704 Howeve
1ad60 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69  r, the usable si
1ad70 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ze is not allowe
1ad80 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c  d to.    ** be l
1ad90 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e  ess than 480. In
1ada0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
1adb0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
1adc0 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a  s 512, then the.
1add0 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20      ** reserved 
1ade0 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f  space size canno
1adf0 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a  t exceed 32. */.
1ae00 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
1ae10 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
1ae20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1ae30 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1ae40 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
1ae50 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
1ae60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1ae70 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
1ae80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ae90 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1aea0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1aeb0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
1aec0 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
1aed0 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
1aee0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
1aef0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
1af00 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
1af10 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
1af20 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
1af30 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
1af40 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
1af50 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
1af60 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
1af70 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
1af80 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
1af90 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
1afa0 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
1afb0 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
1afc0 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
1afd0 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
1afe0 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
1aff0 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
1b000 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
1b010 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
1b020 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
1b030 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
1b040 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
1b050 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
1b060 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
1b070 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
1b080 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
1b090 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
1b0a0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
1b0b0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
1b0c0 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
1b0d0 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
1b0e0 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ter, a header wh
1b0f0 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
1b100 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
1b110 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
1b120 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
1b130 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
1b140 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
1b150 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
1b160 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
1b170 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  xLocal = (u16)((
1b180 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1b190 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29  12)*64/255 - 23)
1b1a0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
1b1b0 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
1b1c0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
1b1d0 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  2/255 - 23);.  p
1b1e0 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75  Bt->maxLeaf = (u
1b1f0 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
1b200 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74  ize - 35);.  pBt
1b210 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36  ->minLeaf = (u16
1b220 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1b230 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
1b240 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  23);.  if( pBt->
1b250 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a  maxLocal>127 ){.
1b260 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
1b270 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a  ePayload = 127;.
1b280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
1b290 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
1b2a0 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78  d = (u8)pBt->max
1b2b0 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  Local;.  }.  ass
1b2c0 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
1b2d0 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
1b2e0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
1b2f0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
1b300 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50  Page1;.  pBt->nP
1b310 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
1b320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b330 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
1b340 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
1b350 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
1b360 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
1b370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1b380 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
1b390 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1b3a0 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
1b3b0 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
1b3c0 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
1b3d0 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
1b3e0 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
1b3f0 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
1b400 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
1b410 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
1b420 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
1b430 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1b440 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
1b450 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
1b460 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
1b470 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
1b480 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
1b490 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
1b4a0 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
1b4b0 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
1b4c0 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
1b4d0 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
1b4e0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1b4f0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1b500 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
1b510 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
1b520 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
1b530 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
1b540 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
1b550 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1b560 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
1b570 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
1b580 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
1b590 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1b5a0 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
1b5b0 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
1b5c0 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
1b5d0 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
1b5e0 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
1b5f0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
1b600 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
1b610 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
1b620 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
1b630 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
1b640 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
1b650 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
1b660 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
1b670 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
1b680 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
1b690 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
1b6a0 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
1b6b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
1b6c0 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
1b6d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b6e0 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
1b6f0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
1b700 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
1b710 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1b720 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
1b730 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
1b740 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
1b750 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
1b760 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1b770 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1b780 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
1b790 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1b7a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b7b0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1b7c0 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
1b7d0 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
1b7e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b7f0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1b800 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
1b810 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
1b820 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
1b830 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
1b840 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
1b850 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b860 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1b870 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
1b880 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  0 ){.    MemPage
1b890 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1b8a0 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65  pPage1;.    asse
1b8b0 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74  rt( pPage1->aDat
1b8c0 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
1b8d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1b8e0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1b8f0 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74  r)==1 );.    pBt
1b900 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
1b910 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
1b920 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20  Null(pPage1);.  
1b930 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
1b940 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
1b950 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
1b960 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
1b970 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
1b980 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
1b990 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
1b9a0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1b9b0 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
1b9c0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1b9d0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
1b9e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1b9f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
1ba00 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1ba10 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
1ba20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1ba30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1ba40 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1ba50 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
1ba60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1ba70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ba80 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
1ba90 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
1baa0 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
1bab0 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
1bac0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1bad0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
1bae0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1baf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1bb00 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
1bb10 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1bb20 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
1bb30 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1bb40 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
1bb50 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
1bb60 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1bb70 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
1bb80 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
1bb90 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1bba0 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
1bbb0 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
1bbc0 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
1bbd0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
1bbe0 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
1bbf0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
1bc00 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
1bc10 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
1bc20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
1bc30 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
1bc40 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1bc50 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
1bc60 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
1bc70 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
1bc80 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
1bc90 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
1bca0 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
1bcb0 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
1bcc0 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
1bcd0 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
1bce0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1bcf0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
1bd00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bd10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1bd20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1bd30 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
1bd40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
1bd50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1bd60 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1bd70 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
1bd80 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
1bd90 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1bda0 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
1bdb0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
1bdc0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1bdd0 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
1bde0 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
1bdf0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
1be00 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
1be10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1be20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1be30 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
1be40 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1be50 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
1be60 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
1be70 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
1be80 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1be90 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
1bea0 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
1beb0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
1bec0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1bed0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1bee0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1bef0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1bf00 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
1bf10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1bf20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1bf30 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
1bf40 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
1bf50 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
1bf60 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
1bf70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1bf80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bf90 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1bfa0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
1bfb0 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
1bfc0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1bfd0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
1bfe0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1bff0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
1c000 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
1c010 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
1c020 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1c030 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
1c040 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
1c050 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1c060 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
1c070 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
1c080 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
1c090 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
1c0a0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
1c0b0 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
1c0c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
1c0d0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
1c0e0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1c0f0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
1c100 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
1c110 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
1c120 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
1c130 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
1c140 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1c150 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
1c160 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1c170 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1c180 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
1c190 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1c1a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1c1b0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
1c1c0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
1c1d0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
1c1e0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
1c1f0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1c200 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1c210 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1c220 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1c230 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1c240 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1c250 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1c260 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1c270 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c280 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1c290 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c2a0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1c2b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1c2c0 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1c2d0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1c2e0 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1c2f0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1c300 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1c310 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1c320 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1c330 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1c340 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1c350 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1c360 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1c370 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1c380 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1c390 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1c3a0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1c3b0 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1c3c0 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1c3d0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1c3e0 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1c3f0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1c400 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1c410 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1c420 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1c430 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1c440 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1c450 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1c460 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1c470 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1c480 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1c490 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1c4a0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1c4b0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1c4c0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1c4d0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1c4e0 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1c4f0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1c500 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1c510 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1c520 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1c530 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1c540 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1c550 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1c560 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1c570 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1c580 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1c590 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1c5a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1c5b0 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1c5c0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1c5d0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1c5e0 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1c5f0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1c600 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1c610 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1c620 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c630 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1c640 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1c650 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72  rflag){.  BtShar
1c660 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1c670 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1c680 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 43  ITE_OK;.  int bC
1c690 6f 6e 63 75 72 72 65 6e 74 20 3d 20 28 70 2d 3e  oncurrent = (p->
1c6a0 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
1c6b0 26 26 20 21 49 53 41 55 54 4f 56 41 43 55 55 4d  && !ISAUTOVACUUM
1c6c0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  );..  sqlite3Btr
1c6d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1c6e0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1c6f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
1c700 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
1c710 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
1c720 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
1c730 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
1c740 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1c750 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
1c760 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
1c770 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
1c780 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
1c790 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1c7a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1c7b0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
1c7c0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
1c7d0 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
1c7e0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1c7f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1c800 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c810 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  n==TRANS_WRITE |
1c820 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  | IfNotOmitAV(pB
1c830 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
1c840 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
1c850 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
1c860 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
1c870 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
1c880 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
1c890 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1c8a0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1c8b0 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
1c8c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1c8d0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1c8e0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1c8f0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1c900 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1c910 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73  _CACHE.  {.    s
1c920 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
1c930 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   0;.    /* If an
1c940 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
1c950 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
1c960 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
1c970 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
1c980 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
1c990 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
1c9a0 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
1c9b0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1c9c0 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  on is.    ** req
1c9d0 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1c9e0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1c9f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72    */.    if( (wr
1ca00 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
1ca10 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1ca20 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c  S_WRITE).     ||
1ca30 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1ca40 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1ca50 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1ca60 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
1ca70 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65  iter->db;.    }e
1ca80 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
1ca90 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b   ){.      BtLock
1caa0 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66   *pIter;.      f
1cab0 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1cac0 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1cad0 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1cae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1caf0 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1cb00 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63  .          pBloc
1cb10 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
1cb20 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  e->db;.         
1cb30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cb40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1cb50 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29      if( pBlock )
1cb60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1cb70 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1cb80 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1cb90 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1cba0 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1cbb0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74  CACHE;.      got
1cbc0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1cbd0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1cbe0 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
1cbf0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
1cc00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
1cc10 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
1cc20 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
1cc30 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
1cc40 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1cc50 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
1cc60 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
1cc70 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
1cc80 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1cc90 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
1cca0 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
1ccb0 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1ccc0 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
1ccd0 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
1cce0 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
1ccf0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
1cd00 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
1cd10 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1cd20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
1cd30 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
1cd40 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
1cd50 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1cd60 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1cd70 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
1cd80 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
1cd90 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
1cda0 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
1cdb0 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
1cdc0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
1cdd0 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
1cde0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1cdf0 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
1ce00 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
1ce10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
1ce20 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1ce30 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
1ce40 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
1ce50 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
1ce60 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
1ce70 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1ce80 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
1ce90 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
1cea0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
1ceb0 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
1cec0 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
1ced0 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
1cee0 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
1cef0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1cf00 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
1cf10 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1cf20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
1cf30 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
1cf40 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
1cf50 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
1cf60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cf70 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1cf80 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1cf90 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1cfa0 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
1cfb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1cfc0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
1cfd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1cfe0 20 65 78 46 6c 61 67 20 3d 20 62 43 6f 6e 63 75   exFlag = bConcu
1cff0 72 72 65 6e 74 20 3f 20 2d 31 20 3a 20 28 77 72  rrent ? -1 : (wr
1d000 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
1d010 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d020 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
1d030 67 65 72 2c 20 65 78 46 6c 61 67 2c 20 73 71 6c  ger, exFlag, sql
1d040 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
1d050 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
1d060 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d070 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d080 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1d090 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1d0a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1d0b0 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
1d0c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d0d0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1d0e0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1d0f0 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
1d100 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
1d110 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
1d120 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d130 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
1d140 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
1d150 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
1d160 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1d170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1d180 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1d190 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1d1a0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1d1b0 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
1d1c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1d1d0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
1d1e0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
1d1f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d200 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
1d210 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
1d220 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
1d230 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
1d240 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
1d250 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
1d260 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
1d270 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
1d280 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
1d290 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1d2a0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
1d2b0 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
1d2c0 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
1d2d0 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
1d2e0 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
1d2f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1d300 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1d310 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
1d320 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  Trans;.    }.   
1d330 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
1d340 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
1d350 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1d360 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e1;.#ifndef SQLI
1d370 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1d380 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72  ACHE.      asser
1d390 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
1d3a0 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
1d3b0 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
1d3c0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1d3d0 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56  &= ~BTS_EXCLUSIV
1d3e0 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  E;.      if( wrf
1d3f0 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73  lag>1 ) pBt->bts
1d400 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43  Flags |= BTS_EXC
1d410 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a  LUSIVE;.#endif..
1d420 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d430 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66  db-size header f
1d440 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63  ield is incorrec
1d450 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  t (as it may be 
1d460 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20  if an old.      
1d470 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65  ** client has be
1d480 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  en writing the d
1d490 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75  atabase file), u
1d4a0 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f  pdate it now. Do
1d4b0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
1d4c0 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  s sooner rather 
1d4d0 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73  than later means
1d4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1d4f0 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20  ze can safely . 
1d500 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20       ** re-read 
1d510 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1d520 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66  e from page 1 if
1d530 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20   a savepoint or 
1d540 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
1d550 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63    ** rollback oc
1d560 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1d570 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
1d580 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1d590 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34  pBt->nPage!=get4
1d5a0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1d5b0 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20  ata[28]) ){.    
1d5c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d5d0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1d5e0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1d5f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d610 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1d620 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1d630 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1d640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d650 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e      }.  }...tran
1d660 73 5f 62 65 67 75 6e 3a 0a 23 69 66 6e 64 65 66  s_begun:.#ifndef
1d670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
1d680 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20 62 43  CURRENT.  if( bC
1d690 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 72 63 3d  oncurrent && rc=
1d6a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
1d6b0 6c 69 74 65 33 50 61 67 65 72 49 73 57 61 6c 28  lite3PagerIsWal(
1d6c0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1d6d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d6e0 50 61 67 65 72 42 65 67 69 6e 43 6f 6e 63 75 72  PagerBeginConcur
1d6f0 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rent(pBt->pPager
1d700 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d710 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1d720 61 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ag ){.      rc =
1d730 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f   btreePtrmapAllo
1d740 63 61 74 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  cate(pBt);.    }
1d750 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1d760 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d770 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1d780 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
1d790 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
1d7a0 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
1d7b0 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
1d7c0 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
1d7d0 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
1d7e0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1d7f0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1d800 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
1d810 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1d820 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1d830 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
1d840 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
1d850 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1d860 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   nSavepoint = p-
1d870 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  >db->nSavepoint;
1d880 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d890 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1d8a0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1d8b0 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   nSavepoint);.  
1d8c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d8d0 5f 4f 4b 20 26 26 20 6e 53 61 76 65 70 6f 69 6e  _OK && nSavepoin
1d8e0 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
1d8f0 62 74 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e  btreePtrmapBegin
1d900 28 70 42 74 2c 20 6e 53 61 76 65 70 6f 69 6e 74  (pBt, nSavepoint
1d910 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d920 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1d930 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1d940 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1d950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1d960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1d970 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
1d980 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
1d990 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
1d9a0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
1d9b0 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
1d9c0 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
1d9d0 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
1d9e0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1d9f0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
1da00 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
1da10 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
1da20 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1da30 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
1da40 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
1da50 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
1da60 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
1da70 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da90 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
1daa0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
1dab0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1dac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dad0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
1dae0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
1daf0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1db20 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
1db30 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1db40 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  Bt;.  Pgno pgno 
1db50 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
1db60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1db70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1db80 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1db90 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49  );.  rc = btreeI
1dba0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1dbb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dbc0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1dbd0 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
1dbe0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
1dbf0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1dc00 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
1dc10 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1dc20 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
1dc30 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
1dc40 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1dc50 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1dc60 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1dc70 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1dc80 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1dc90 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1dca0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1dcb0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1dcc0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1dcd0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1dce0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1dcf0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1dd00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1dd10 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1dd20 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1dd30 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1dd40 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1dd50 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1dd60 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72  , &rc);.  }..  r
1dd70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1dd80 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
1dd90 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
1dda0 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
1ddb0 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
1ddc0 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
1ddd0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
1dde0 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
1ddf0 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
1de00 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
1de10 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
1de20 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
1de30 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
1de40 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
1de50 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1de60 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1de70 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
1de80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1de90 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
1dea0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1deb0 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
1dec0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1ded0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1dee0 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
1def0 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
1df00 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
1df10 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
1df20 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
1df30 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1df40 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
1df50 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
1df60 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
1df70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1df80 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1dfa0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1dfb0 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
1dfc0 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
1dfd0 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
1dfe0 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
1dff0 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
1e000 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
1e010 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1e020 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1e030 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1e040 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1e050 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1e060 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
1e070 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
1e080 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1e090 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
1e0a0 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
1e0b0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1e0c0 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
1e0d0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
1e0e0 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
1e0f0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
1e100 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1e110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e120 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e130 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
1e140 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
1e150 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e160 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
1e170 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63  Cell;.    int rc
1e180 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ;..    rc = btre
1e190 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1e1a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e1b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43  eturn rc;.    nC
1e1c0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1e1d0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
1e1e0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1e1f0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
1e200 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1e210 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
1e220 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1e230 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
1e240 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1e250 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  o;.        pPage
1e260 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
1e270 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1e280 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1e290 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
1e2a0 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
1e2b0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b        if( pCell+
1e2c0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61  info.nSize > pPa
1e2d0 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
1e2e0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1e2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e310 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e330 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
1e340 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1e350 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20  .nSize-4) ){.   
1e360 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1e370 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1e380 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20  ze-4, iTo);.    
1e390 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e3a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e3b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1e3c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1e3d0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1e3e0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1e3f0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1e400 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1e410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1e420 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e430 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1e440 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1e450 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1e460 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1e470 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1e480 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1e490 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1e4a0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1e4b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e4c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e4d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1e4e0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1e4f0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1e500 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1e510 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1e530 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
1e540 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
1e550 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
1e560 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
1e570 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
1e580 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
1e590 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
1e5a0 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
1e5b0 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
1e5c0 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
1e5d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
1e5e0 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1e5f0 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
1e600 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
1e610 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
1e620 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1e630 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
1e640 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
1e650 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
1e660 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
1e670 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
1e680 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
1e690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
1e6a0 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
1e6b0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1e6c0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
1e6d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
1e6e0 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
1e6f0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
1e700 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1e730 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
1e740 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1e750 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
1e760 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1e770 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
1e780 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1e790 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
1e7a0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
1e7b0 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
1e7c0 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
1e7d0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
1e7e0 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1e7f0 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
1e800 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1e810 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
1e820 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
1e830 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
1e840 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
1e850 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
1e860 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
1e870 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
1e880 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
1e890 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1e8a0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1e8b0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1e8c0 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
1e8d0 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
1e8e0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1e8f0 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
1e900 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1e910 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1e920 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
1e930 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e940 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1e950 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1e960 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
1e970 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
1e980 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
1e990 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
1e9a0 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
1e9b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
1e9c0 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
1e9d0 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
1e9e0 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
1e9f0 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
1ea00 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
1ea10 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
1ea20 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1ea30 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
1ea40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ea50 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
1ea60 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
1ea70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1ea80 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
1ea90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1eaa0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1eab0 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
1eac0 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
1ead0 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
1eae0 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
1eaf0 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
1eb00 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
1eb10 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
1eb20 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
1eb30 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1eb40 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
1eb50 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1eb60 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
1eb70 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
1eb80 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
1eb90 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
1eba0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
1ebb0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
1ebc0 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
1ebd0 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
1ebe0 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
1ebf0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1ec00 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
1ec10 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
1ec20 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
1ec30 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
1ec40 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
1ec50 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1ec60 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
1ec70 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1ec80 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1ec90 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1eca0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
1ecb0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
1ecc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1ecd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ece0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ecf0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1ed00 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
1ed10 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
1ed20 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1ed30 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
1ed40 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
1ed50 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
1ed60 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
1ed70 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
1ed80 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
1ed90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1eda0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1edb0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1edc0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
1edd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
1ede0 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
1edf0 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
1ee00 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
1ee10 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
1ee20 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
1ee30 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
1ee40 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1ee50 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
1ee60 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
1ee70 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
1ee80 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1ee90 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1eea0 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
1eeb0 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
1eec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1eed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1eee0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1eef0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ef00 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
1ef10 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1ef20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ef30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1ef40 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1ef50 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1ef60 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1ef70 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
1ef80 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
1ef90 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1efa0 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
1efb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1efc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1efd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1efe0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1eff0 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
1f000 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1f010 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1f020 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f030 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
1f040 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
1f050 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
1f060 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
1f070 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1f080 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
1f090 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
1f0a0 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
1f0b0 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
1f0c0 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
1f0d0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1f0e0 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
1f0f0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
1f100 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
1f110 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
1f120 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
1f130 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  fore no point in
1f140 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69   .** calling thi
1f150 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
1f160 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
1f170 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e  _DONE. Or, if an
1f180 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
1f190 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  s, return some o
1f1a0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e  ther error code.
1f1b0 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
1f1c0 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66  ifically, this f
1f1d0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1f1e0 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
1f1f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  the database so 
1f200 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73  .** that the las
1f210 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
1f220 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
1f230 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  use is no longer
1f240 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50   in use..**.** P
1f250 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73  arameter nFin is
1f260 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1f270 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64  ages that this d
1f280 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f  atabase would co
1f290 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68  ntain.** were th
1f2a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
1f2b0 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  ed until it retu
1f2c0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  rns SQLITE_DONE.
1f2d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43  .**.** If the bC
1f2e0 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20  ommit parameter 
1f2f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
1f300 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
1f310 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  es that the .** 
1f320 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
1f330 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
1f340 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20  uumStep() until 
1f350 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1f360 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e  E_DONE .** or an
1f370 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20   error. bCommit 
1f380 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66  is passed true f
1f390 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1f3a0 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20  m-on-commit .** 
1f3b0 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61  operation, or fa
1f3c0 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65  lse for an incre
1f3d0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1f3e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1f3f0 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
1f400 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1f410 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
1f420 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  Pg, int bCommit)
1f430 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
1f440 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1f450 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1f460 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
1f470 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
1f480 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1f490 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1f4a0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1f4b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
1f4c0 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
1f4d0 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
1f4e0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1f4f0 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
1f500 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f510 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
1f520 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
1f530 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
1f540 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
1f550 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1f560 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
1f570 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
1f580 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f590 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1f5a0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
1f5b0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
1f5c0 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
1f5d0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1f5e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f5f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1f600 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1f610 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1f620 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
1f630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f640 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f650 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
1f660 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1f670 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
1f680 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1f690 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
1f6a0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1f6b0 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
1f6c0 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
1f6d0 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
1f6e0 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  ** if bCommit is
1f6f0 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
1f700 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
1f710 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
1f720 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
1f730 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
1f740 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1f750 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
1f760 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
1f770 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
1f780 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
1f790 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
1f7a0 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
1f7b0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
1f7c0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
1f7d0 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1f7e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1f7f0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1f800 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1f810 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
1f820 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b   BTALLOC_EXACT);
1f830 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1f840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f850 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f860 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1f870 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1f880 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
1f890 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1f8a0 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1f8b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
1f8c0 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
1f8d0 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
1f8e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1f8f0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
1f900 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
1f910 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1f920 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38  LastPg;.      u8
1f930 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1f940 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20  _ANY;   /* Mode 
1f950 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1f960 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1f970 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20  ) */.      Pgno 
1f980 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20  iNear = 0;      
1f990 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70       /* nearby p
1f9a0 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1f9b0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1f9c0 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
1f9d0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1f9e0 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
1f9f0 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
1fa00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fa10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1fa20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
1fa30 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d        /* If bCom
1fa40 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  mit is zero, thi
1fa50 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
1fa60 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
1fa70 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
1fa80 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
1fa90 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
1faa0 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
1fab0 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
1fac0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1fad0 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
1fae0 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74  hand, if bCommit
1faf0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1fb00 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
1fb10 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
1fb20 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
1fb30 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
1fb40 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
1fb50 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
1fb60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1fb70 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
1fb80 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1fb90 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1fba0 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1fbb0 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61  LE;.        iNea
1fbc0 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  r = nFin;.      
1fbd0 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  }.      do {.   
1fbe0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1fbf0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1fc00 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1fc10 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1fc20 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1fc30 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  Near, eMode);.  
1fc40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fc50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fc60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1fc70 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1fc80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fc90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fca0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1fcb0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
1fcc0 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26  hile( bCommit &&
1fcd0 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
1fce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1fcf0 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
1fd00 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
1fd10 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
1fd20 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
1fd30 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1fd40 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74  iFreePg, bCommit
1fd50 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1fd60 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1fd70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fd80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fd90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fda0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1fdb0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1fdc0 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
1fdd0 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
1fde0 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50    }while( iLastP
1fdf0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1fe00 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52  PAGE(pBt) || PTR
1fe10 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1fe20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20  iLastPg) );.    
1fe30 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1fe40 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e   = 1;.    pBt->n
1fe50 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a  Page = iLastPg;.
1fe60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1fe70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1fe80 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   The database op
1fe90 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ened by the firs
1fea0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
1feb0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1fec0 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70  abase.** nOrig p
1fed0 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ages in size con
1fee0 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72  taining nFree fr
1fef0 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ee pages. Return
1ff00 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
1ff10 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * size of the da
1ff20 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20  tabase in pages 
1ff30 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74  following an aut
1ff40 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  o-vacuum operati
1ff50 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  on..*/.static Pg
1ff60 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42  no finalDbSize(B
1ff70 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1ff80 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e  no nOrig, Pgno n
1ff90 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e  Free){.  int nEn
1ffa0 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  try;            
1ffb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ffc0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
1ffd0 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65   one ptrmap page
1ffe0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d   */.  Pgno nPtrm
1fff0 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
20000 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20010 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
20020 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
20030 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
20060 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20   */..  nEntry = 
20070 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
20080 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  5;.  nPtrmap = (
20090 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
200a0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
200b0 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
200c0 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e  ntry;.  nFin = n
200d0 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
200e0 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f  Ptrmap;.  if( nO
200f0 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
20100 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
20110 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
20120 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
20130 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77   nFin--;.  }.  w
20140 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
20150 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
20160 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
20170 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20180 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
20190 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e  }..  return nFin
201a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
201b0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
201c0 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
201d0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
201e0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
201f0 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
20200 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
20210 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
20220 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
20230 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
20240 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
20250 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
20260 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
20270 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
20280 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
20290 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
202a0 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
202b0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
202c0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
202d0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
202e0 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
202f0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
20300 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20310 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
20320 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
20330 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20340 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
20350 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20360 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
20370 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
20380 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
20390 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
203a0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
203b0 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
203c0 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
203d0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
203e0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  lse{.    Pgno nO
203f0 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
20400 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50  ount(pBt);.    P
20410 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34  gno nFree = get4
20420 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
20430 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
20440 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66     Pgno nFin = f
20450 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
20460 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a  nOrig, nFree);..
20470 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46      if( nOrig<nF
20480 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  in ){.      rc =
20490 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
204a0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  BKPT;.    }else 
204b0 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20  if( nFree>0 ){. 
204c0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
204d0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
204e0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
204f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20500 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
20510 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
20520 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  he(pBt);.       
20530 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
20540 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
20550 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20  nOrig, 0);.     
20560 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
20570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20580 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20590 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
205a0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
205b0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  e);.        put4
205c0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
205d0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
205e0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
205f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
20600 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20610 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
20620 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20630 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
20640 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
20650 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
20660 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
20670 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
20680 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
20690 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
206a0 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
206b0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
206c0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
206d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
206e0 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
206f0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
20700 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
20710 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20720 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
20730 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
20740 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
20750 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
20760 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
20770 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
20780 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
20790 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
207a0 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
207b0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
207c0 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
207d0 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
207e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
207f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
20800 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
20810 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
20820 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
20830 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
20840 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a  unt(pPager); )..
20850 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20860 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
20870 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
20880 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
20890 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
208a0 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
208b0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
208c0 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
208d0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
208e0 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
208f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
20900 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
20910 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
20920 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
20930 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20940 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
20950 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
20960 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
20970 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
20980 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
20990 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
209a0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
209b0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
209c0 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
209d0 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
209e0 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
209f0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
20a00 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
20a10 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
20a20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
20a30 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
20a40 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
20a50 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
20a60 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
20a70 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
20a80 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
20a90 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
20aa0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
20ab0 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
20ac0 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
20ad0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
20ae0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
20af0 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
20b00 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
20b10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20b20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20b30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
20b40 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
20b50 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
20b60 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20  [36]);.    nFin 
20b70 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
20b80 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
20b90 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e  ;.    if( nFin>n
20ba0 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51  Orig ) return SQ
20bb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20bc0 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c  T;.    if( nFin<
20bd0 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
20be0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
20bf0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
20c00 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72     }.    for(iFr
20c10 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
20c20 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
20c30 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
20c40 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
20c50 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
20c60 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b  nFin, iFree, 1);
20c70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
20c80 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
20c90 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
20ca0 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
20cb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20cc0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
20cd0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
20ce0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
20cf0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
20d00 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
20d10 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
20d20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
20d30 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
20d40 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
20d50 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
20d60 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
20d70 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
20d80 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74  e = 1;.      pBt
20d90 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a  ->nPage = nFin;.
20da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
20db0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20dc0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20dd0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
20de0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
20df0 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71  assert( nRef>=sq
20e00 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
20e10 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
20e20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
20e30 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
20e40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20e50 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
20e60 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
20e70 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
20e80 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
20e90 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
20ea0 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RENT./*.** This 
20eb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20ec0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 6d 65  ed as part of me
20ed0 72 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52  rging an CONCURR
20ee0 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ENT transaction 
20ef0 77 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70  with.** the snap
20f00 73 68 6f 74 20 61 74 20 74 68 65 20 68 65 61 64  shot at the head
20f10 20 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65   of the wal file
20f20 2e 20 49 74 20 72 65 6c 6f 63 61 74 65 73 20 61  . It relocates a
20f30 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a  ll pages in the.
20f40 2a 2a 20 72 61 6e 67 65 20 69 46 69 72 73 74 2e  ** range iFirst.
20f50 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76  .iLast, inclusiv
20f60 65 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  e. It is assumed
20f70 20 74 68 61 74 20 74 68 65 20 42 74 72 65 65 50   that the BtreeP
20f80 74 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75 63 74  trmap .** struct
20f90 75 72 65 20 61 74 20 42 74 53 68 61 72 65 64 2e  ure at BtShared.
20fa0 70 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20 74 68  pMap contains th
20fb0 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
20fc0 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 61  e pointers to ea
20fd0 63 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  ch.** page in th
20fe0 65 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  e range..**.** I
20ff0 66 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 4e  f pnCurrent is N
21000 55 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ULL, then all pa
21010 67 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ges in the range
21020 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 63 75   are moved to cu
21030 72 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20  rrently.** free 
21040 6c 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20  locations (i.e. 
21050 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65  free-list entrie
21060 73 29 20 77 69 74 68 69 6e 20 74 68 65 20 64 61  s) within the da
21070 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
21080 72 65 20 70 61 67 65 0a 2a 2a 20 69 46 69 72 73  re page.** iFirs
21090 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
210a0 70 6e 43 75 72 72 65 6e 74 20 69 73 20 6e 6f 74  pnCurrent is not
210b0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70   NULL, then it p
210c0 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 75 65  oints to a value
210d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a   containing the.
210e0 2a 2a 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  ** current size 
210f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21100 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
21110 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 6c  n this case, all
21120 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 72 65   pages are.** re
21130 6c 6f 63 61 74 65 64 20 74 6f 20 74 68 65 20 65  located to the e
21140 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
21150 73 65 20 66 69 6c 65 20 2d 20 70 61 67 65 20 69  se file - page i
21160 46 69 72 73 74 20 69 73 20 72 65 6c 6f 63 61 74  First is relocat
21170 65 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a  ed to.** page (*
21180 70 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20 70 61  pnCurrent+1), pa
21190 67 65 20 69 46 69 72 73 74 2b 31 20 74 6f 20 70  ge iFirst+1 to p
211a0 61 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b  age (*pnCurrent+
211b0 32 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a  2), and so on..*
211c0 2a 20 56 61 6c 75 65 20 2a 70 6e 43 75 72 72 65  * Value *pnCurre
211d0 6e 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nt is set to the
211e0 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65   new size of the
211f0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
21200 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
21210 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  on returns..**.*
21220 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
21230 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
21240 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
21250 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
21260 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
21270 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
21280 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a  eRelocateRange(.
21290 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 2f 2a 20 42 2d 74 72 65 65 20 68 61 6e 64    /* B-tree hand
212c0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69  le */.  Pgno iFi
212d0 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
212e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
212f0 20 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74   page to relocat
21300 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73  e */.  Pgno iLas
21310 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
21320 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
21330 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20  age to relocate 
21340 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72  */.  Pgno *pnCur
21350 72 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  rent            
21360 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
21370 55 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74  ULL, IN/OUT: Dat
21380 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b  abase size */.){
21390 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
213a0 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74  TE_OK;.  BtreePt
213b0 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74  rmap *pMap = pBt
213c0 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69  ->pMap;.  Pgno i
213d0 50 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69  Pg;..  for(iPg=i
213e0 46 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73  First; iPg<=iLas
213f0 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
21400 4f 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  OK; iPg++){.    
21410 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 20 3d  MemPage *pFree =
21420 20 30 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20   0;     /* Page 
21430 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 66  allocated from f
21440 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20  ree-list */.    
21450 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
21460 3b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b  ;.    Pgno iNew;
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21480 20 4e 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72   New page number
21490 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 20 20   for pPg */.    
214a0 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e  PtrmapEntry *pEn
214b0 74 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  try;    /* Point
214c0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
214d0 20 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20   page iPg */..  
214e0 20 20 69 66 28 20 69 50 67 3d 3d 50 45 4e 44 49    if( iPg==PENDI
214f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
21500 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
21510 20 20 70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70    pEntry = &pMap
21520 2d 3e 61 50 74 72 5b 69 50 67 20 2d 20 70 4d 61  ->aPtr[iPg - pMa
21530 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20  p->iFirst];..   
21540 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 65 54 79   if( pEntry->eTy
21550 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
21560 41 47 45 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  AGE ){.      Pgn
21570 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72  o dummy;.      r
21580 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
21590 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
215a0 65 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20  e, &dummy, iPg, 
215b0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
215c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
215d0 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
215e0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
215f0 54 45 5f 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d  TE_OK || dummy==
21600 69 50 67 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iPg );.    }else
21610 20 69 66 28 20 70 6e 43 75 72 72 65 6e 74 20 29   if( pnCurrent )
21620 7b 0a 20 20 20 20 20 20 62 74 72 65 65 47 65 74  {.      btreeGet
21630 50 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20 26  Page(pBt, iPg, &
21640 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  pPg, 0);.      a
21650 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
21660 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
21670 50 67 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  Pg->pDbPage) );.
21680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
21690 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
216a0 66 63 6f 75 6e 74 28 70 50 67 2d 3e 70 44 62 50  fcount(pPg->pDbP
216b0 61 67 65 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20  age)==1 );.     
216c0 20 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75   iNew = ++(*pnCu
216d0 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  rrent);.      if
216e0 28 20 69 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f  ( iNew==PENDING_
216f0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
21700 20 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75   iNew = ++(*pnCu
21710 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  rrent);.      rc
21720 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
21730 70 42 74 2c 20 70 50 67 2c 20 70 45 6e 74 72 79  pBt, pPg, pEntry
21740 2d 3e 65 54 79 70 65 2c 20 70 45 6e 74 72 79 2d  ->eType, pEntry-
21750 3e 70 61 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31  >parent, iNew, 1
21760 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
21770 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  PageNotNull(pPg)
21780 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21790 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
217a0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
217b0 70 46 72 65 65 2c 20 26 69 4e 65 77 2c 20 69 46  pFree, &iNew, iF
217c0 69 72 73 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f  irst-1, BTALLOC_
217d0 4c 45 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  LE);.      asser
217e0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
217f0 20 7c 7c 20 69 4e 65 77 3c 69 46 69 72 73 74 20   || iNew<iFirst 
21800 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21820 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
21830 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Pg = 0;.        
21840 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
21850 65 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  e);.        btre
21860 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
21870 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  g, &pPg, 0);.   
21880 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
21890 74 65 50 61 67 65 28 70 42 74 2c 20 70 50 67 2c  tePage(pBt, pPg,
218a0 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20   pEntry->eType, 
218b0 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c 69  pEntry->parent,i
218c0 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20 20 20 20  New,1);.        
218d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
218e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
218f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21900 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28  .}../* !defined(
21910 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
21920 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68  URRENT).**.** Th
21930 65 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  e b-tree handle 
21940 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
21950 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ly argument is a
21960 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69 74 20 61  bout to commit a
21970 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52 45 4e 54 20  n.** CONCURRENT 
21980 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20  transaction. At 
21990 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
219a0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
219b0 20 74 68 69 73 20 69 73 20 0a 2a 2a 20 70 6f 73   this is .** pos
219c0 73 69 62 6c 65 20 2d 20 74 68 65 20 77 61 6c 20  sible - the wal 
219d0 57 52 49 54 45 52 20 6c 6f 63 6b 20 69 73 20 68  WRITER lock is h
219e0 65 6c 64 20 61 6e 64 20 69 74 20 69 73 20 6b 6e  eld and it is kn
219f0 6f 77 6e 20 74 68 61 74 20 74 68 65 72 65 20 61  own that there a
21a00 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69  re .** no confli
21a10 63 74 73 20 77 69 74 68 20 63 6f 6d 6d 69 74 74  cts with committ
21a20 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
21a30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
21a40 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28  treeFixUnlocked(
21a50 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
21a60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21a70 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
21a80 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
21a90 61 67 65 31 3b 0a 20 20 75 38 20 2a 70 31 20 3d  age1;.  u8 *p1 =
21aa0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
21ab0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
21ac0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
21ad0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21ae0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 61  _OK;..  /* If pa
21af0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
21b00 62 61 73 65 20 69 73 20 6e 6f 74 20 77 72 69 74  base is not writ
21b10 61 62 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 70 61  able, then no pa
21b20 67 65 73 20 77 65 72 65 20 61 6c 6c 6f 63 61 74  ges were allocat
21b30 65 64 0a 20 20 2a 2a 20 6f 72 20 66 72 65 65 64  ed.  ** or freed
21b40 20 62 79 20 74 68 69 73 20 74 72 61 6e 73 61 63   by this transac
21b50 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
21b60 73 65 20 6e 6f 20 73 70 65 63 69 61 6c 20 68 61  se no special ha
21b70 6e 64 6c 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20  ndling is .  ** 
21b80 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
21b90 69 73 65 2c 20 69 66 20 70 61 67 65 20 31 20 69  ise, if page 1 i
21ba0 73 20 64 69 72 74 79 2c 20 70 72 6f 63 65 65 64  s dirty, proceed
21bb0 2e 20 20 2a 2f 0a 20 20 42 74 72 65 65 50 74 72  .  */.  BtreePtr
21bc0 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d  map *pMap = pBt-
21bd0 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 54  >pMap;.  Pgno iT
21be0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
21bf0 26 70 31 5b 33 32 5d 29 3b 0a 20 20 50 67 6e 6f  &p1[32]);.  Pgno
21c00 20 6e 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   nPage = btreePa
21c10 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
21c20 75 33 32 20 6e 46 72 65 65 20 3d 20 67 65 74 34  u32 nFree = get4
21c30 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a  byte(&p1[36]);..
21c40 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
21c50 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  Map );.  rc = sq
21c60 6c 69 74 65 33 50 61 67 65 72 55 70 67 72 61 64  lite3PagerUpgrad
21c70 65 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72  eSnapshot(pPager
21c80 2c 20 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  , pPage1->pDbPag
21c90 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31  e);.  assert( p1
21ca0 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ==pPage1->aData 
21cb0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
21cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
21cd0 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20 67 65 74  gno nHPage = get
21ce0 34 62 79 74 65 28 26 70 31 5b 32 38 5d 29 3b 0a  4byte(&p1[28]);.
21cf0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
21d00 6e 48 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  nHPage;         
21d10 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 61 66  /* Size of db af
21d20 74 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ter transaction 
21d30 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20 20 69 66  merge */..    if
21d40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
21d50 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
21d60 2d 3e 70 44 62 50 61 67 65 29 20 29 7b 0a 20 20  ->pDbPage) ){.  
21d70 20 20 20 20 50 67 6e 6f 20 69 48 54 72 75 6e 6b      Pgno iHTrunk
21d80 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b   = get4byte(&p1[
21d90 33 32 5d 29 3b 0a 20 20 20 20 20 20 75 33 32 20  32]);.      u32 
21da0 6e 48 46 72 65 65 20 3d 20 67 65 74 34 62 79 74  nHFree = get4byt
21db0 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 20  e(&p1[36]);..   
21dc0 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
21dd0 20 68 65 61 64 20 64 61 74 61 62 61 73 65 20 66   head database f
21de0 72 65 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  ree list to the 
21df0 65 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  end of the curre
21e00 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  nt.      ** tran
21e10 73 61 63 74 69 6f 6e 73 20 66 72 65 65 2d 6c 69  sactions free-li
21e20 73 74 20 28 69 66 20 61 6e 79 29 2e 20 20 2a 2f  st (if any).  */
21e30 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
21e40 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k!=0 ){.        
21e50 70 75 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d  put4byte(&p1[36]
21e60 2c 20 6e 48 46 72 65 65 20 2b 20 6e 46 72 65 65  , nHFree + nFree
21e70 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
21e80 79 74 65 28 26 70 31 5b 33 32 5d 2c 20 69 54 72  yte(&p1[32], iTr
21e90 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 77 68  unk);.        wh
21ea0 69 6c 65 28 20 69 54 72 75 6e 6b 20 29 7b 0a 20  ile( iTrunk ){. 
21eb0 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
21ec0 2a 70 54 72 75 6e 6b 20 3d 20 73 71 6c 69 74 65  *pTrunk = sqlite
21ed0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
21ee0 67 65 72 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ger, iTrunk);.  
21ef0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
21f00 20 67 65 74 34 62 79 74 65 28 28 75 38 2a 29 70   get4byte((u8*)p
21f10 54 72 75 6e 6b 2d 3e 70 44 61 74 61 29 3b 0a 20  Trunk->pData);. 
21f20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 54 72           if( iTr
21f30 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk==0 ){.      
21f40 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 28        put4byte((
21f50 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74  u8*)pTrunk->pDat
21f60 61 2c 20 69 48 54 72 75 6e 6b 29 3b 0a 20 20 20  a, iHTrunk);.   
21f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21f80 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
21f90 6e 72 65 66 28 70 54 72 75 6e 6b 29 3b 0a 20 20  nref(pTrunk);.  
21fa0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d        };.      }
21fb0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 48 50 61  ..      if( nHPa
21fc0 67 65 3c 28 70 4d 61 70 2d 3e 69 46 69 72 73 74  ge<(pMap->iFirst
21fd0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  -1) ){.        /
21fe0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
21ff0 6f 6e 73 69 73 74 65 64 20 6f 66 20 28 70 4d 61  onsisted of (pMa
22000 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 70 61 67  p->iFirst-1) pag
22010 65 73 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  es when the curr
22020 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ent.        ** c
22030 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  oncurrent transa
22040 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
22050 2e 20 41 6e 64 20 61 6e 20 63 6f 6e 63 75 72 72  . And an concurr
22060 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
22070 6d 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  may.        ** n
22080 6f 74 20 62 65 20 65 78 65 63 75 74 65 64 20 6f  ot be executed o
22090 6e 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n an auto-vacuum
220a0 20 64 61 74 61 62 61 73 65 20 2d 20 73 6f 20 74   database - so t
220b0 68 65 20 64 62 20 73 68 6f 75 6c 64 20 0a 20 20  he db should .  
220c0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76        ** not hav
220d0 65 20 73 68 72 75 6e 6b 20 73 69 6e 63 65 20 74  e shrunk since t
220e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
220f0 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 72 65  as opened. There
22100 66 6f 72 65 20 6e 48 50 61 67 65 0a 20 20 20 20  fore nHPage.    
22110 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
22120 20 73 65 74 20 74 6f 20 28 70 4d 61 70 2d 3e 69   set to (pMap->i
22130 46 69 72 73 74 2d 31 29 20 6f 72 20 67 72 65 61  First-1) or grea
22140 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ter. */.        
22150 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
22160 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
22170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
22180 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 72  * The current tr
22190 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 63 61  ansaction alloca
221a0 74 65 64 20 70 61 67 65 73 20 70 4d 61 70 2d 3e  ted pages pMap->
221b0 69 46 69 72 73 74 20 74 68 72 6f 75 67 68 0a 20  iFirst through. 
221c0 20 20 20 20 20 20 20 2a 2a 20 6e 50 61 67 65 20         ** nPage 
221d0 28 69 6e 63 6c 75 73 69 76 65 29 20 61 74 20 74  (inclusive) at t
221e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
221f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4d 65 61  tabase file. Mea
22200 6e 77 68 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  nwhile,.        
22210 2a 2a 20 6f 74 68 65 72 20 74 72 61 6e 73 61 63  ** other transac
22220 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 6c 6f 63  tions have alloc
22230 61 74 65 64 20 28 69 46 69 72 73 74 2e 2e 6e 48  ated (iFirst..nH
22240 50 61 67 65 29 2e 20 53 6f 20 6d 6f 76 65 0a 20  Page). So move. 
22250 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20         ** pages 
22260 28 69 46 69 72 73 74 2e 2e 4d 49 4e 28 6e 50 61  (iFirst..MIN(nPa
22270 67 65 2c 6e 48 50 61 67 65 29 29 20 74 6f 20 28  ge,nHPage)) to (
22280 4d 41 58 28 6e 50 61 67 65 2c 6e 48 50 61 67 65  MAX(nPage,nHPage
22290 29 2b 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  )+1).  */.      
222a0 20 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d 20 4d    Pgno iLast = M
222b0 49 4e 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65  IN(nPage, nHPage
222c0 29 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61  );    /* Last pa
222d0 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
222e0 20 20 20 20 20 20 50 67 6e 6f 20 6e 43 75 72 72        Pgno nCurr
222f0 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
22300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
22310 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 64 62 20  rent size of db 
22320 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 75 72 72  */.        nCurr
22330 65 6e 74 20 3d 20 4d 41 58 28 6e 50 61 67 65 2c  ent = MAX(nPage,
22340 20 6e 48 50 61 67 65 29 3b 0a 20 20 20 20 20 20   nHPage);.      
22350 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f    rc = btreeRelo
22360 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20 70  cateRange(pBt, p
22370 4d 61 70 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61  Map->iFirst, iLa
22380 73 74 2c 20 26 6e 43 75 72 72 65 6e 74 29 3b 0a  st, &nCurrent);.
22390 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72  .        /* Ther
223a0 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 63 6f 6c  e are now no col
223b0 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 74 68 65  lisions with the
223c0 20 73 6e 61 70 73 68 6f 74 20 61 74 20 74 68 65   snapshot at the
223d0 20 68 65 61 64 20 6f 66 20 74 68 65 0a 20 20 20   head of the.   
223e0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
223f0 20 66 69 6c 65 2e 20 53 6f 20 61 74 20 74 68 69   file. So at thi
22400 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
22410 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
22420 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  write.        **
22430 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22440 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 42 65   out to disk. Be
22450 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f 20 74 68  fore doing so th
22460 6f 75 67 68 2c 20 61 74 74 65 6d 70 74 20 74 6f  ough, attempt to
22470 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6c 6f  .        ** relo
22480 63 61 74 65 20 73 6f 6d 65 20 6f 66 20 74 68 65  cate some of the
22490 20 6e 65 77 20 70 61 67 65 73 20 74 6f 20 66 72   new pages to fr
224a0 65 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74  ee locations wit
224b0 68 69 6e 20 74 68 65 20 62 6f 64 79 0a 20 20 20  hin the body.   
224c0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64       ** of the d
224d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 69 2e  atabase file (i.
224e0 65 2e 20 66 72 65 65 2d 6c 69 73 74 20 65 6e 74  e. free-list ent
224f0 72 69 65 73 29 2e 20 2a 2f 0a 20 20 20 20 20 20  ries). */.      
22500 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
22520 20 61 73 73 65 72 74 28 20 6e 43 75 72 72 65 6e   assert( nCurren
22530 74 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t!=PENDING_BYTE_
22540 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
22550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
22560 67 65 72 53 65 74 44 62 73 69 7a 65 28 70 42 74  gerSetDbsize(pBt
22570 2d 3e 70 50 61 67 65 72 2c 20 6e 43 75 72 72 65  ->pPager, nCurre
22580 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  nt);.          n
22590 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
225a0 26 70 31 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20  &p1[36]);.      
225b0 20 20 20 20 6e 46 69 6e 20 3d 20 4d 41 58 28 6e      nFin = MAX(n
225c0 43 75 72 72 65 6e 74 2d 6e 46 72 65 65 2c 20 6e  Current-nFree, n
225d0 48 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  HPage);.        
225e0 20 20 69 66 28 20 6e 43 75 72 72 65 6e 74 3e 50    if( nCurrent>P
225f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
22600 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50  (pBt) && nFin<=P
22610 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
22620 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
22630 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
22640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22650 20 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c     rc = btreeRel
22660 6f 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20  ocateRange(pBt, 
22670 6e 46 69 6e 2b 31 2c 20 6e 43 75 72 72 65 6e 74  nFin+1, nCurrent
22680 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
22690 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
226a0 65 28 26 70 31 5b 32 38 5d 2c 20 6e 46 69 6e 29  e(&p1[28], nFin)
226b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
226c0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
226d0 53 65 74 44 62 73 69 7a 65 28 70 50 61 67 65 72  SetDbsize(pPager
226e0 2c 20 6e 46 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20  , nFin);.  }..  
226f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
22700 73 65 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65  se.# define btre
22710 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 58 29 20  eFixUnlocked(X) 
22720 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
22730 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
22740 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a  _CONCURRENT */..
22750 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
22760 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
22770 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
22780 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
22790 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
227a0 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
227b0 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
227c0 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
227d0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
227e0 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
227f0 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
22800 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
22810 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
22820 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
22830 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
22840 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
22850 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
22860 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
22870 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
22880 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
22890 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
228a0 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
228b0 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
228c0 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
228d0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
228e0 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
228f0 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
22900 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
22910 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
22920 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22930 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
22940 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
22950 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
22960 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
22970 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
22980 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
22990 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
229a0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
229b0 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
229c0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
229d0 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
229e0 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
229f0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
22a00 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
22a10 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
22a20 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
22a30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
22a40 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
22a50 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
22a60 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
22a70 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
22a80 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
22a90 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
22aa0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
22ab0 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
22ac0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
22ad0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
22ae0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
22af0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
22b00 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
22b10 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
22b20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
22b30 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
22b40 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
22b50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
22b60 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
22b70 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
22b80 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
22b90 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
22ba0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
22bb0 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
22bc0 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
22bd0 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
22be0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
22bf0 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
22c00 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
22c10 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
22c20 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
22c30 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
22c40 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
22c50 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
22c60 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
22c70 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
22c80 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
22c90 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
22ca0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22cb0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
22cc0 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
22cd0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
22ce0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22cf0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
22d00 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22d10 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
22d20 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22d30 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
22d40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 23  treeEnter(p);..#
22d50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22d60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
22d70 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
22d80 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 61  acuum ){.      a
22d90 73 73 65 72 74 28 20 49 53 43 4f 4e 43 55 52 52  ssert( ISCONCURR
22da0 45 4e 54 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ENT==0 );.      
22db0 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
22dc0 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
22dd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
22df0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
22e00 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
22e10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
22e20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
22e30 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29  t->bDoTruncate )
22e40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
22e50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
22e60 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
22e70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
22e80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
22e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22ea0 26 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29  & ISCONCURRENT )
22eb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
22ec0 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28 70 29  eeFixUnlocked(p)
22ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22ef0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22f00 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
22f10 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
22f20 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
22f30 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22f40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
22f50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
22f70 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
22f80 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
22f90 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
22fa0 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
22fb0 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
22fc0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
22fd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
22fe0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
22ff0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
23000 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
23010 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
23020 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
23030 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  *db = p->db;.  a
23040 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
23050 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
23060 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
23070 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
23080 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
23090 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
230a0 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  if.  if( p->inTr
230b0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
230c0 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  & db->nVdbeRead>
230d0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
230e0 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61  here are other a
230f0 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
23100 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
23110 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20  this database.  
23120 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77    ** handle, dow
23130 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64  ngrade to a read
23140 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
23150 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61  n. The other sta
23160 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d  tements.    ** m
23170 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
23180 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
23190 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64  abase.  */.    d
231a0 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
231b0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
231c0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
231d0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
231e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
231f0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
23200 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
23210 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
23220 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
23230 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
23240 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
23250 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
23260 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
23270 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
23280 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
23290 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
232a0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
232b0 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
232c0 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
232d0 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
232e0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
232f0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
23300 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
23310 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
23320 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
23330 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
23340 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
23350 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
23360 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
23370 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
23380 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
23390 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
233a0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
233b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
233c0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
233d0 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
233e0 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
233f0 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
23400 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
23410 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
23420 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
23430 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
23440 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
23450 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
23460 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
23470 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
23480 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
23490 73 20 77 61 73 20 61 6e 20 43 4f 4e 43 55 52 52  s was an CONCURR
234a0 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ENT transaction,
234b0 20 64 65 6c 65 74 65 20 74 68 65 20 70 42 74 2d   delete the pBt-
234c0 3e 70 4d 61 70 20 6f 62 6a 65 63 74 2e 0a 20 20  >pMap object..  
234d0 2a 2a 20 41 6c 73 6f 20 63 61 6c 6c 20 50 61 67  ** Also call Pag
234e0 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28  erEndConcurrent(
234f0 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
23500 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 64   the pager has d
23510 69 73 63 61 72 64 65 64 0a 20 20 2a 2a 20 74 68  iscarded.  ** th
23520 65 20 72 65 63 6f 72 64 20 6f 66 20 61 6c 6c 20  e record of all 
23530 70 61 67 65 73 20 72 65 61 64 20 77 69 74 68 69  pages read withi
23540 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
23550 6e 2e 20 20 2a 2f 0a 20 20 62 74 72 65 65 50 74  n.  */.  btreePt
23560 72 6d 61 70 44 65 6c 65 74 65 28 70 42 74 29 3b  rmapDelete(pBt);
23570 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45  .  sqlite3PagerE
23580 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74  ndConcurrent(pBt
23590 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 62 74 72  ->pPager);.  btr
235a0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
235b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
235c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
235d0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
235e0 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
235f0 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
23600 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
23610 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
23620 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
23630 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
23640 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
23650 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
23660 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
23670 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
23680 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
23690 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
236a0 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
236b0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
236c0 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
236d0 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
236e0 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
236f0 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
23700 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
23710 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
23720 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
23730 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
23740 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
23750 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
23760 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
23770 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
23780 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
23790 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
237a0 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
237b0 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
237c0 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
237d0 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
237e0 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
237f0 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
23800 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
23810 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
23820 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
23830 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
23840 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
23850 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
23860 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
23870 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
23880 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
23890 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
238a0 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
238b0 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
238c0 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
238d0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
238e0 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
238f0 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
23900 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
23910 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
23920 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
23930 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
23940 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
23950 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
23960 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
23970 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
23980 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
23990 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
239a0 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
239b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
239c0 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
239d0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
239e0 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
239f0 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
23a00 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
23a10 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
23a20 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
23a30 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
23a40 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
23a50 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
23a60 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
23a70 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
23a80 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
23a90 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
23aa0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
23ab0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
23ac0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
23ad0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
23ae0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
23af0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
23b00 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
23b10 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
23b20 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
23b30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
23b40 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
23b50 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
23b60 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
23b70 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
23b80 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
23b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
23ba0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
23bb0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
23bc0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
23bd0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
23be0 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
23bf0 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
23c00 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
23c10 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
23c20 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
23c30 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
23c40 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
23c50 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
23c60 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
23c70 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
23c80 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
23c90 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
23ca0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
23cb0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
23cc0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
23cd0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
23ce0 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
23cf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23d00 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
23d10 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
23d20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
23d30 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
23d40 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
23d50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
23d60 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
23d70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
23d80 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d  p->iDataVersion-
23d90 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74  -;  /* Compensat
23da0 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44  e for pPager->iD
23db0 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f  ataVersion++; */
23dc0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
23dd0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
23de0 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
23df0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
23e00 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
23e10 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
23e20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
23e30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
23e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23e50 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
23e60 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
23e70 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
23e80 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
23e90 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
23ea0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
23eb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
23ec0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
23ed0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
23ee0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
23ef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23f00 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23f10 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
23f20 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p, 0);.  }.  sql
23f30 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
23f40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23f50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
23f60 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
23f70 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
23f80 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
23f90 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
23fa0 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
23fb0 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74  cursor on any Bt
23fc0 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
23fd0 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
23fe0 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69  .  Or if the wri
23ff0 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73  teOnly flag is s
24000 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e  et to 1, then on
24010 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65  ly.** trip write
24020 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61   cursors and lea
24030 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ve read cursors 
24040 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
24050 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
24060 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
24070 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  be tripped, incl
24080 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a  uding cursors.**
24090 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
240a0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
240b0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
240c0 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20  happen to be.** 
240d0 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68  sharing the cach
240e0 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
240f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24100 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
24110 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
24120 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69  curs. If the wri
24130 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69  teOnly.** flag i
24140 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c  s true, then onl
24150 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  y write-cursors 
24160 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20  need be tripped 
24170 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  - read-only.** c
24180 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69  ursors save thei
24190 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  r current positi
241a0 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ons so that they
241b0 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a   may continue .*
241c0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
241d0 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66  rollback. Or, if
241e0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
241f0 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  lse, all cursors
24200 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64   are .** tripped
24210 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72  . In general, wr
24220 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
24230 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
24240 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c  ion being.** rol
24250 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65  led back modifie
24260 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
24270 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63  chema. In this c
24280 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a  ase b-tree root.
24290 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20  ** pages may be 
242a0 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64  moved or deleted
242b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
242c0 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d  se altogether, m
242d0 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61  aking.** it unsa
242e0 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73  fe for read curs
242f0 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ors to continue.
24300 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72  .**.** If the wr
24310 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
24320 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f  true and an erro
24330 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
24340 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e   while .** savin
24350 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
24360 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64  sition of a read
24370 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c  -only cursor, al
24380 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69  l cursors, .** i
24390 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61  ncluding all rea
243a0 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  d-cursors are tr
243b0 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ipped..**.** SQL
243c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
243d0 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
243e0 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
243f0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a   occurs while.**
24400 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72   saving a cursor
24410 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51   position, an SQ
24420 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
24430 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24440 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
24450 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
24460 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69  , int errCode, i
24470 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
24480 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
24490 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
244a0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  OK;..  assert( (
244b0 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  writeOnly==0 || 
244c0 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26  writeOnly==1) &&
244d0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d   BTCF_WriteFlag=
244e0 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72  =1 );.  if( pBtr
244f0 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
24500 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
24510 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  ee);.    for(p=p
24520 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
24530 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
24540 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
24550 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  ;.      if( writ
24560 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
24570 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
24580 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
24590 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
245a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
245b0 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
245c0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
245d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
245e0 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
245f0 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
24600 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24620 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
24630 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
24640 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
24650 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
24660 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
24670 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24690 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
246a0 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
246b0 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
246c0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
246d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
246e0 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
246f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
24700 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
24710 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
24720 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
24730 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
24740 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
24750 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
24760 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24770 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
24780 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
24790 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
247a0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
247b0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
247c0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
247d0 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
247e0 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
247f0 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
24800 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
24810 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
24820 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
24830 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
24840 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
24850 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
24860 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
24870 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
24880 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
24890 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
248a0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
248b0 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
248c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
248d0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
248e0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
248f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
24900 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
24910 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
24920 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
24930 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
24940 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24950 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
24960 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
24970 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
24980 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
24990 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
249a0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
249b0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
249c0 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
249d0 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
249e0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
249f0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
24a00 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
24a10 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
24a20 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
24a30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
24a40 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
24a50 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
24a60 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
24a70 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
24a80 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
24a90 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
24aa0 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
24ab0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
24ac0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
24ad0 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
24ae0 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
24af0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
24b00 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
24b10 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
24b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
24b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
24b40 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
24b50 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
24b60 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
24b70 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
24b80 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
24b90 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
24ba0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
24bb0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
24bc0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
24bd0 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
24be0 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
24bf0 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
24c00 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
24c10 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
24c20 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
24c30 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
24c40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
24c50 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
24c60 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
24c70 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
24c80 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
24c90 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
24ca0 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
24cb0 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
24cc0 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
24cd0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
24ce0 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
24cf0 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
24d00 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
24d10 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
24d20 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
24d30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
24d40 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
24d50 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
24d60 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
24d70 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
24d80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
24d90 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
24da0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
24db0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
24dc0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
24dd0 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
24de0 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
24df0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
24e00 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
24e10 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
24e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
24e30 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
24e40 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30  rsors(pBt, 1)==0
24e50 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
24e60 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
24e70 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
24e80 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
24e90 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
24ea0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
24eb0 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
24ec0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
24ed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24ee0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
24ef0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
24f00 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
24f10 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65  ansaction can be
24f20 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
24f30 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
24f40 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
24f50 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
24f60 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
24f70 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
24f80 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
24f90 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
24fa0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
24fb0 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
24fc0 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
24fd0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
24fe0 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
24ff0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
25000 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
25010 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
25020 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
25030 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
25040 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
25050 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
25060 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
25070 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
25080 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
25090 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
250a0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
250b0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
250c0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
250d0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
250e0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
250f0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
25100 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
25110 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
25120 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
25130 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
25140 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
25150 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
25160 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
25170 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
25180 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
25190 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
251a0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
251b0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
251c0 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
251d0 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
251e0 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
251f0 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
25200 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
25210 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
25220 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
25230 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
25240 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
25250 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
25260 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
25270 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
25280 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
25290 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
252a0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
252b0 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
252c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
252d0 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
252e0 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
252f0 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
25300 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
25310 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
25320 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
25330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
25340 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
25350 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
25360 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
25370 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
25380 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
25390 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
253a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
253b0 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
253c0 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
253d0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
253e0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
253f0 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
25400 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
25410 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
25420 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
25430 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
25440 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
25450 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
25460 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
25470 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
25480 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
25490 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
254a0 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
254b0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
254c0 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
254d0 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
254e0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
254f0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
25500 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
25510 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
25520 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
25530 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
25540 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
25550 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25560 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
25570 74 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28  treePtrmapBegin(
25580 70 42 74 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  pBt, iStatement)
25590 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
255a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
255b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
255c0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
255d0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
255e0 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
255f0 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
25600 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
25610 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
25620 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
25630 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
25640 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
25650 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
25660 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
25670 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
25680 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
25690 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
256a0 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
256b0 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
256c0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
256d0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
256e0 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
256f0 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
25700 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
25710 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
25720 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
25730 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
25740 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
25750 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
25760 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
25770 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
25780 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
25790 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
257a0 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
257b0 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
257c0 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
257d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
257e0 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
257f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25800 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
25810 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
25820 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
25830 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25840 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
25850 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
25860 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
25870 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
25880 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
25890 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
258a0 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
258b0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
258c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
258d0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
258e0 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
258f0 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
25900 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
25910 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
25920 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 62 74 72  nter(p);.    btr
25930 65 65 50 74 72 6d 61 70 45 6e 64 28 70 42 74 2c  eePtrmapEnd(pBt,
25940 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
25950 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41  ;.    if( op==SA
25960 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
25970 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
25980 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
25990 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
259a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
259b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
259c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
259d0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
259e0 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65  Pager, op, iSave
259f0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
25a00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
25a20 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
25a30 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
25a40 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
25a50 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
25a60 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
25a70 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
25a80 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
25a90 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
25aa0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
25ab0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
25ac0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
25ad0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
25ae0 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
25af0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
25b00 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
25b10 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
25b20 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
25b30 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
25b40 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
25b50 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
25b60 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
25b70 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
25b80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
25b90 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
25ba0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
25bb0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
25bc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25bd0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
25be0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
25bf0 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
25c00 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
25c10 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
25c20 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
25c30 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
25c40 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
25c50 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
25c60 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
25c70 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
25c80 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
25c90 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
25ca0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
25cb0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
25cc0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
25cd0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
25ce0 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
25cf0 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
25d00 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
25d10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
25d20 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f  TREE_WRCSR bit o
25d30 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61  f wrFlag is clea
25d40 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  r, then the curs
25d50 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62  or can only.** b
25d60 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
25d70 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45  ng.  If the BTRE
25d80 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73  E_WRCSR bit is s
25d90 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  et, then the cur
25da0 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  sor.** can be us
25db0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
25dc0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66  r for writing if
25dd0 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
25de0 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  s for writing.**
25df0 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
25e00 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f  These are the co
25e10 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
25e20 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
25e30 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e  er.** for writin
25e40 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a  g to be allowed:
25e50 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
25e60 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
25e70 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
25e80 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69   wrFlag containi
25e90 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  ng BTREE_WRCSR.*
25ea0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
25eb0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
25ec0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
25ed0 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
25ee0 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
25ef0 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
25f00 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
25f10 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
25f20 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
25f30 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
25f40 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
25f50 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
25f60 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
25f70 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
25f80 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
25f90 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
25fa0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
25fb0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
25fc0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
25fd0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
25fe0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
25ff0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
26000 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
26010 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
26020 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
26030 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
26040 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
26050 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54  on..**.** The BT
26060 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69  REE_FORDELETE bi
26070 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20  t of wrFlag may 
26080 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65  optionally be se
26090 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52  t if BTREE_WRCSR
260a0 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20  .** is set.  If 
260b0 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74  FORDELETE is set
260c0 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74  , that is a hint
260d0 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
260e0 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74  tation that.** t
260f0 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  his cursor will 
26100 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20  only be used to 
26110 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65  seek to and dele
26120 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e  te entries of an
26130 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72   index.** as par
26140 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45  t of a larger DE
26150 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  LETE statement. 
26160 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68   The FORDELETE h
26170 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  int is not used 
26180 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65  by.** this imple
26190 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20  mentation.  But 
261a0 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61  in a hypothetica
261b0 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74  l alternative st
261c0 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a  orage engine .**
261d0 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   in which index 
261e0 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f  entries are auto
261f0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
26200 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e  d when correspon
26210 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f  ding table.** ro
26220 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  ws are deleted, 
26230 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c  the FORDELETE fl
26240 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61  ag is a hint tha
26250 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44  t all SEEK and D
26260 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69  ELETE.** operati
26270 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73  ons on this curs
26280 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73  or can be no-ops
26290 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70   and all READ op
262a0 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a  erations can .**
262b0 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72   return a null r
262c0 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30  ow (2-bytes: 0x0
262d0 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e  1 0x00)..**.** N
262e0 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
262f0 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
26300 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
26310 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
26320 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
26330 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
26340 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
26350 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
26360 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
26370 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
26380 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
26390 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
263a0 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
263b0 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
263c0 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
263d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
263e0 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
263f0 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
26400 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
26410 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
26420 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
26430 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26450 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
26460 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
26490 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
264a0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
264b0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
264c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264d0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
264e0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
264f0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
26500 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
26510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
26520 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
26530 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
26540 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
26550 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
26560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
26570 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
26580 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
26590 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
265a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
265b0 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
265c0 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  ee handle */.  B
265d0 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20  tCursor *pX;    
265e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67        /* Looping
26600 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20   over other all 
26610 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73  cursors */..  as
26620 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
26630 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
26640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
26650 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  lag==0 .       |
26660 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f  | wrFlag==BTREE_
26670 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c  WRCSR .       ||
26680 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f   wrFlag==(BTREE_
26690 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44  WRCSR|BTREE_FORD
266a0 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20  ELETE) .  );..  
266b0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
266c0 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
266d0 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
266e0 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
266f0 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
26700 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
26710 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
26720 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
26730 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
26740 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
26750 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
26760 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
26770 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
26780 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
26790 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
267a0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
267b0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
267c0 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
267d0 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61  yInfo!=0, (wrFla
267e0 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73  g?2:1)) );.  ass
267f0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
26800 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
26810 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
26820 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
26830 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
26840 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
26850 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
26860 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
26870 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
26880 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
26890 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
268a0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
268b0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
268c0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
268d0 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
268e0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
268f0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
26900 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
26910 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
26920 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77  )==0 );..  if( w
26930 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c  rFlag ){.    all
26940 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
26950 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  Bt);.    if( pBt
26960 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29  ->pTmpSpace==0 )
26970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26980 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
26990 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
269a0 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
269b0 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
269c0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
269d0 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
269e0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
269f0 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
26a00 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
26a10 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
26a20 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
26a30 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
26a40 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
26a50 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
26a60 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
26a70 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
26a80 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
26a90 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
26aa0 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
26ab0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
26ac0 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
26ad0 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
26ae0 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
26af0 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46  ->curFlags = wrF
26b00 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65  lag ? BTCF_Write
26b10 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72  Flag : 0;.  pCur
26b20 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
26b30 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50  = wrFlag ? 0 : P
26b40 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
26b50 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  Y;.  /* If there
26b60 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
26b70 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
26b80 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
26b90 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63   all such.  ** c
26ba0 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61  ursors *must* ha
26bb0 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74  ve the BTCF_Mult
26bc0 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a  iple flag set. *
26bd0 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e  /.  for(pX=pBt->
26be0 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d  pCursor; pX; pX=
26bf0 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
26c00 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74  if( pX->pgnoRoot
26c10 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29  ==(Pgno)iTable )
26c20 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46  {.      pX->curF
26c30 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
26c40 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75  tiple;.      pCu
26c50 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
26c60 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
26c70 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e    }.  }.  pCur->
26c80 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
26c90 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75  rsor;.  pBt->pCu
26ca0 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
26cb0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
26cc0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
26cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26ce0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
26cf0 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
26d00 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26d30 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
26d40 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d60 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
26d70 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
26d80 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
26d90 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26db0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
26dc0 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
26dd0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
26de0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
26e10 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
26e20 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
26e30 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e50 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
26e60 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
26e70 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54  int rc;.  if( iT
26e80 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63  able<1 ){.    rc
26e90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
26ea0 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
26eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
26ec0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
26ed0 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
26ee0 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
26ef0 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
26f00 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  r);.    sqlite3B
26f10 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
26f20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26f30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
26f40 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
26f50 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
26f60 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
26f70 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
26f80 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
26f90 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
26fa0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
26fb0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
26fc0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
26fd0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
26fe0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
26ff0 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
27000 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
27010 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
27020 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
27030 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
27040 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
27050 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
27060 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
27070 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
27080 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
27090 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
270a0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
270b0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
270c0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
270d0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
270e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
270f0 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
27100 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
27110 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
27120 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
27130 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
27140 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
27150 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
27160 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
27170 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
27180 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
27190 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
271a0 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
271b0 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
271c0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
271d0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
271e0 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
271f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
27200 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
27210 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
27220 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
27230 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
27240 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
27250 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
27260 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
27270 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
27280 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
27290 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
272a0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
272b0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
272c0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
272d0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
272e0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
272f0 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
27300 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
27310 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
27320 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
27330 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
27340 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
27350 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
27360 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
27370 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
27380 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
27390 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
273a0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72     if( pBt->pCur
273b0 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  sor==pCur ){.   
273c0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
273d0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
273e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
273f0 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20  BtCursor *pPrev 
27400 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
27410 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
27420 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65    if( pPrev->pNe
27430 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  xt==pCur ){.    
27440 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65        pPrev->pNe
27450 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
27460 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
27470 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
27480 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72       pPrev = pPr
27490 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ev->pNext;.     
274a0 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28   }while( ALWAYS(
274b0 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a  pPrev) );.    }.
274c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
274d0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
274e0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
274f0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
27500 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
27510 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
27520 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
27530 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
27540 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
27550 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
27560 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
27570 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
27580 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
27590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
275a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
275b0 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
275c0 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
275d0 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
275e0 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
275f0 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
27600 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
27610 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
27620 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
27630 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
27640 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
27650 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
27660 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
27670 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
27680 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
27690 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
276a0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
276b0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
276c0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
276d0 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
276e0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
276f0 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
27700 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
27710 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
27720 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
27730 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
27740 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
27750 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
27760 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
27770 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
27780 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
27790 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b  Cur->ix, &info);
277a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
277b0 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d  RUPT_DB || memcm
277c0 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
277d0 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
277e0 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
277f0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
27800 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
27810 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51  #endif.static SQ
27820 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
27830 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
27840 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
27850 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
27860 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
27870 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
27880 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43  r->iPage;.    pC
27890 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
278a0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
278b0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
278c0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
278d0 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 69 78 2c  iPage],pCur->ix,
278e0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
278f0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
27900 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
27910 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
27920 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
27930 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
27940 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
27950 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
27960 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
27970 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
27980 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
27990 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
279a0 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
279b0 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
279c0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
279d0 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
279e0 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
279f0 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
27a00 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
27a10 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
27a20 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
27a30 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
27a40 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
27a50 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
27a60 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
27a70 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
27a80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27a90 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
27aa0 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20  * NDEBUG */.int 
27ab0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
27ac0 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75  orIsValidNN(BtCu
27ad0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
27ae0 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
27af0 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
27b00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27b10 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
27b20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
27b30 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
27b40 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66  key or "rowid" f
27b50 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  or a table btree
27b60 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
27b70 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
27b80 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
27b90 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
27ba0 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  to a.** ordinary
27bb0 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49   table btree.  I
27bc0 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  f the cursor poi
27bd0 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  nts to an index 
27be0 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69  btree or.** is i
27bf0 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75  nvalid, the resu
27c00 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  lt of this routi
27c10 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ne is undefined.
27c20 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
27c30 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42  treeIntegerKey(B
27c40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
27c50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27c60 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
27c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27c80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
27c90 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
27ca0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
27cb0 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65  ntKey );.  getCe
27cc0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
27cd0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66  return pCur->inf
27ce0 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  o.nKey;.}../*.**
27cf0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
27d00 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70  er of bytes of p
27d10 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65  ayload for the e
27d20 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69  ntry that pCur i
27d30 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70  s.** currently p
27d40 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72  ointing to.  For
27d50 20 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74   table btrees, t
27d60 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
27d70 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74  amount.** of dat
27d80 61 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74  a.  For index bt
27d90 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
27da0 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  be the size of t
27db0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
27dc0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
27dd0 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
27de0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
27df0 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
27e00 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
27e10 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
27e20 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
27e30 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
27e40 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
27e50 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
27e60 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
27e70 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75  RSOR_VALID..*/.u
27e80 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  32 sqlite3BtreeP
27e90 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72  ayloadSize(BtCur
27ea0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
27eb0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
27ec0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
27ed0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27ee0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27ef0 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
27f00 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
27f10 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
27f20 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a  .nPayload;.}../*
27f30 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
27f40 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
27f50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
27f60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
27f70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
27f80 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
27f90 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
27fa0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
27fb0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
27fc0 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
27fd0 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
27fe0 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
27ff0 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
28000 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
28010 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
28020 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
28030 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
28040 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
28050 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
28060 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
28070 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
28080 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
28090 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
280a0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
280b0 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
280c0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
280d0 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
280e0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
280f0 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
28100 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
28110 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
28120 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
28130 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
28140 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
28150 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
28160 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
28170 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
28180 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
28190 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
281a0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
281b0 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
281c0 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
281d0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
281e0 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
281f0 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
28200 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
28210 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
28220 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
28230 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
28240 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
28250 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
28260 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
28270 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
28280 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
28290 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
282a0 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
282b0 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
282c0 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
282d0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
282e0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
282f0 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
28300 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
28310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28320 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28330 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
28340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28350 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
28360 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
28370 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
28380 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
28390 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
283a0 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
283b0 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
283c0 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
283d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
283e0 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
283f0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
28400 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
28410 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
28420 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
28430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28440 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
28450 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
28460 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
28470 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
28480 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
28490 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
284a0 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
284b0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
284c0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
284d0 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
284e0 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
284f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
28500 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
28510 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
28520 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
28530 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
28540 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
28550 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
28560 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
28570 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
28580 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
28590 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
285a0 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
285b0 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
285c0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
285d0 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
285e0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
285f0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
28600 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
28610 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
28620 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
28630 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
28640 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
28650 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
28660 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
28670 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
28680 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
28690 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
286a0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
286b0 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
286c0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
286d0 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
286e0 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
286f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28700 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
28710 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
28720 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
28730 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
28740 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
28750 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
28760 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
28770 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
28780 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
28790 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
287a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
287b0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
287c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
287d0 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
287e0 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
287f0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
28800 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
28810 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28820 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
28830 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
28850 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
28860 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
28870 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
28880 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
28890 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
288a0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
288b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
288c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
288d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
288e0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
288f0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
28900 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
28910 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
28920 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
28930 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
28940 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
28950 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
28960 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
28970 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
28980 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
28990 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
289a0 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
289b0 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
289c0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
289d0 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
289e0 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
289f0 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
28a00 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
28a10 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
28a20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
28a30 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
28a40 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
28a50 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
28a60 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
28a70 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
28a80 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
28a90 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
28aa0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
28ab0 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
28ac0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
28ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
28ae0 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
28af0 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
28b00 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
28b10 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
28b20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b40 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
28b50 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
28b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28b70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
28b80 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
28b90 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
28ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
28bb0 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
28bc0 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
28bd0 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
28be0 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
28bf0 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
28c00 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
28c10 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
28c20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
28c30 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
28c40 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
28c50 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
28c60 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
28c70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
28c80 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
28c90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28ca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
28cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
28cc0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
28cd0 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
28ce0 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
28cf0 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
28d00 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
28d10 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
28d20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
28d30 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
28d40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
28d50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28d60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
28d70 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
28d80 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
28d90 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
28da0 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
28db0 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
28dc0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
28dd0 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
28de0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
28df0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
28e00 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
28e10 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
28e20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
28e30 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
28e40 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
28e50 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
28e60 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
28e70 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
28e80 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
28e90 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
28ea0 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
28eb0 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
28ec0 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
28ed0 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
28ee0 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
28ef0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
28f00 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
28f10 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
28f20 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
28f30 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
28f40 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
28f50 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
28f60 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
28f70 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
28f80 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
28f90 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
28fa0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
28fb0 70 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75  pages.** this fu
28fc0 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63  nction may alloc
28fd0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ate space for an
28fe0 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  d lazily populat
28ff0 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f  e.** the overflo
29000 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
29010 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
29020 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
29030 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
29040 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
29050 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
29060 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
29070 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
29080 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
29090 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
290a0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
290b0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
290c0 6f 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20  ocated, it must 
290d0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
290e0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
290f0 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
29100 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
29110 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
29120 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
29130 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
29140 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
29150 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
29160 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
29170 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
29180 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
29190 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
291a0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
291b0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
291c0 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
291d0 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
291e0 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
291f0 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
29200 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
29210 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
29220 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
29230 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
29240 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
29250 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
29260 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
29270 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
29280 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
29290 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
292a0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
292b0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
292c0 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
292d0 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
292f0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
29300 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
29310 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
29320 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
29330 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
29340 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29360 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
29370 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
29380 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
29390 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
293a0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
293b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
293c0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
293d0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
293e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
293f0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
29400 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
29410 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
29420 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
29430 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
29440 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
29450 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
29460 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
29470 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
29480 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75  VERFLOW_READ.  u
29490 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
294a0 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d  onst pBufStart =
294b0 20 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74   pBuf;     /* St
294c0 61 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  art of original 
294d0 6f 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65  out buffer */.#e
294e0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
294f0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
29500 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70  t( eOp==0 || eOp
29510 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
29520 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29530 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29540 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29550 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
29560 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
29570 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
29580 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
29590 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
295a0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
295b0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.pPayload;.  
295c0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61  assert( offset+a
295d0 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  mt <= pCur->info
295e0 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20  .nPayload );..  
295f0 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64  assert( aPayload
29600 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   > pPage->aData 
29610 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28  );.  if( (uptr)(
29620 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65  aPayload - pPage
29630 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d  ->aData) > (pBt-
29640 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43  >usableSize - pC
29650 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29  ur->info.nLocal)
29660 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
29670 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
29680 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
29690 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
296a0 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20  n error.  The.  
296b0 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c    ** conditional
296c0 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79   above is really
296d0 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61  :.    **    &aPa
296e0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
296f0 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
29700 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
29710 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a  ableSize].    **
29720 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69   but is recast i
29730 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20  nto its current 
29740 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e  form to avoid in
29750 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70  teger overflow p
29760 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20  roblems.    */. 
29770 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29780 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
29790 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
297a0 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
297b0 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
297c0 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
297d0 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
297e0 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
297f0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
29800 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
29810 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
29820 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
29830 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
29840 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
29850 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
29860 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
29870 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
29880 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
29890 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
298a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
298b0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
298c0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
298d0 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
298e0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
298f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
29900 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d  .  }...  if( rc=
29910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
29920 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
29930 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
29940 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
29950 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
29960 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
29970 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
29980 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
29990 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
299a0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
299b0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
299c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
299d0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
299e0 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
299f0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
29a00 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
29a10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
29a20 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
29a30 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
29a40 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
29a50 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
29a60 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
29a70 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
29a80 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
29a90 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
29aa0 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
29ab0 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
29ac0 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
29ad0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
29ae0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
29af0 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
29b00 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
29b10 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
29b20 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
29b30 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
29b40 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
29b50 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
29b60 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
29b70 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
29b80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
29b90 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
29ba0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
29bb0 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
29bc0 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d   if( nOvfl>pCur-
29bd0 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20  >nOvflAlloc ){. 
29be0 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65         Pgno *aNe
29bf0 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74  w = (Pgno*)sqlit
29c00 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
29c10 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
29c20 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
29c30 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
29c40 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
29c50 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
29c60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
29c70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
29c80 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
29c90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
29ca0 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e  ->nOvflAlloc = n
29cb0 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20  Ovfl*2;.        
29cc0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
29cd0 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  w = aNew;.      
29ce0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29cf0 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61    memset(pCur->a
29d00 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76  Overflow, 0, nOv
29d10 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29  fl*sizeof(Pgno))
29d20 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
29d30 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
29d40 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65  alidOvfl;.    }e
29d50 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
29d60 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
29d70 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
29d80 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
29d90 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
29da0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
29db0 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
29dc0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
29dd0 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
29de0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
29df0 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
29e00 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
29e10 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
29e20 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  vflSize] ){.    
29e30 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
29e40 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
29e50 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
29e60 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
29e70 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 20 20  [iIdx];.        
29e80 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
29e90 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
29ea0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
29eb0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
29ec0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b  E_OK && amt>0 );
29ed0 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 65 78 74  .    while( next
29ee0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Page ){.      /*
29ef0 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
29f00 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
29f10 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
29f20 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  che. */.      as
29f30 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65  sert( pCur->aOve
29f40 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20  rflow[iIdx]==0. 
29f50 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
29f60 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
29f70 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a  iIdx]==nextPage.
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
29f90 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
29fa0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
29fb0 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
29fc0 74 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 69 66  tPage;..      if
29fd0 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
29fe0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
29ff0 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
2a000 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
2a010 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
2a020 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
2a030 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
2a040 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
2a050 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
2a060 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
2a070 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
2a080 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
2a090 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
2a0a0 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
2a0b0 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
2a0c0 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
2a0d0 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
2a0e0 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
2a0f0 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
2a100 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
2a110 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
2a120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a130 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2a140 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b  TCF_ValidOvfl );
2a150 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a160 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
2a170 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  b==pBt->db );.  
2a180 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2a190 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
2a1a0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
2a1b0 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
2a1c0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
2a1d0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
2a1e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2a1f0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
2a200 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
2a210 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
2a220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a230 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
2a240 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
2a250 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
2a260 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
2a270 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
2a280 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
2a290 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
2a2a0 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
2a2b0 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
2a2c0 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
2a2d0 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
2a2e0 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
2a2f0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
2a300 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
2a310 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
2a320 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 2f 2a 20  le *fd;      /* 
2a330 46 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  File from which 
2a340 74 6f 20 64 6f 20 64 69 72 65 63 74 20 6f 76 65  to do direct ove
2a350 72 66 6c 6f 77 20 72 65 61 64 20 2a 2f 0a 23 65  rflow read */.#e
2a360 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
2a370 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
2a380 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
2a390 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
2a3a0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
2a3b0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
2a3c0 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
2a3d0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
2a3e0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
2a3f0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
2a400 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
2a410 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
2a420 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2a430 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
2a440 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
2a450 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
2a460 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
2a470 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
2a480 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
2a490 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
2a4a0 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
2a4b0 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72  re is no open wr
2a4c0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
2a4d0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
2a4e0 20 20 34 29 20 74 68 65 20 64 61 74 61 62 61 73    4) the databas
2a4f0 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64  e is file-backed
2a500 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
2a510 20 20 20 35 29 20 74 68 65 20 70 61 67 65 20 69     5) the page i
2a520 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 57 41 4c  s not in the WAL
2a530 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a   file.        **
2a540 20 20 20 36 29 20 61 74 20 6c 65 61 73 74 20 34     6) at least 4
2a550 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65   bytes have alre
2a560 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e  ady been read in
2a570 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
2a580 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ffer .        **
2a590 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2a5a0 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
2a5b0 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
2a5c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a5d0 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
2a5e0 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
2a5f0 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
2a600 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
2a610 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
2a620 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
2a630 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
2a640 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
2a650 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
2a660 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
2a670 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2a680 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20  eOp==0          
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6b0 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
2a6c0 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
2a6d0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2a700 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
2a710 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
2a720 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44  tion==TRANS_READ
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a740 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20       /* (3) */. 
2a750 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d          && (fd =
2a760 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
2a770 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d  e(pBt->pPager))-
2a780 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a  >pMethods     /*
2a790 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
2a7a0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 50 61   && 0==sqlite3Pa
2a7b0 67 65 72 55 73 65 57 61 6c 28 70 42 74 2d 3e 70  gerUseWal(pBt->p
2a7c0 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 29  Pager, nextPage)
2a7d0 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f         /* (5) */
2a7e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42  .         && &pB
2a7f0 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72  uf[-4]>=pBufStar
2a800 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a820 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  /* (6) */.      
2a830 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
2a840 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
2a850 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
2a860 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
2a870 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a880 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72  aWrite>=pBufStar
2a890 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  t );            
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a8b0 64 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20  due to (6) */.  
2a8c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
2a8d0 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
2a8e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2a8f0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
2a900 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
2a910 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
2a920 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
2a930 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
2a940 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2a950 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
2a960 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
2a970 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
2a980 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2a990 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
2a9a0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
2a9b0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
2a9c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2a9d0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
2a9e0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
2a9f0 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
2aa00 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20        (eOp==0 ? 
2aa10 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
2aa20 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  LY : 0).        
2aa30 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
2aa40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2aa50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2aa60 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
2aa70 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
2aa80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2aa90 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
2aaa0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
2aab0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
2aac0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
2aad0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
2aae0 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
2aaf0 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
2ab00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ab10 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
2ab20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2ab30 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
2ab40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ab50 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
2ab60 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 69 66  -= a;.        if
2ab70 28 20 61 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  ( amt==0 ) retur
2ab80 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70 42  n rc;.        pB
2ab90 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
2aba0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2abb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 49 64  break;.      iId
2abc0 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  x++;.    }.  }..
2abd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2abe0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
2abf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ac00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
2ac10 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69  /* Overflow chai
2ac20 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65  n ends premature
2ac30 6c 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ly */.  }.  retu
2ac40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ac50 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
2ac60 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65   payload for the
2ac70 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68   row at which th
2ac80 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
2ac90 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  s currently.** p
2aca0 6f 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20  ointing.  "amt" 
2acb0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
2acc0 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70  ansferred into p
2acd0 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
2ace0 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
2acf0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
2ad00 2a 20 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f  * pCur can be po
2ad10 69 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72  inting to either
2ad20 20 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69   a table or an i
2ad30 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20  ndex b-tree..** 
2ad40 49 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  If pointing to a
2ad50 20 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68   table btree, th
2ad60 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73  en the content s
2ad70 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20  ection is read. 
2ad80 20 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70   If.** pCur is p
2ad90 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  ointing to an in
2ada0 64 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20  dex b-tree then 
2adb0 74 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20  the key section 
2adc0 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46  is read..**.** F
2add0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
2ade0 61 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61  ayload(), the ca
2adf0 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
2ae00 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
2ae10 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
2ae20 61 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20  alid row in the 
2ae30 74 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69  table.  For sqli
2ae40 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
2ae50 68 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a  hecked(), the.**
2ae60 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65   cursor might be
2ae70 20 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68   invalid or migh
2ae80 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73  t need to be res
2ae90 74 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  tored before bei
2aea0 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52  ng read..**.** R
2aeb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2aec0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
2aed0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2aee0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
2aef0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
2af00 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af10 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
2af20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
2af30 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
2af40 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
2af50 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2af60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2af70 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
2af80 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
2af90 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2afa0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2afb0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2afc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2afd0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2afe0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2aff0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
2b000 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b010 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2b020 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
2b030 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b040 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
2b050 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
2b060 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
2b070 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
2b080 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
2b090 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
2b0a0 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69   variant of sqli
2b0b0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
2b0c0 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20  ) works even if 
2b0d0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
2b0e0 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52  ot.** in the CUR
2b0f0 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e  SOR_VALID state.
2b100 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65    It is only use
2b110 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
2b120 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20  _blob_read().** 
2b130 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
2b140 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b150 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69  T_INCRBLOB.stati
2b160 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2b170 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  E int accessPayl
2b180 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74  oadChecked(.  Bt
2b190 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20  Cursor *pCur,.  
2b1a0 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33  u32 offset,.  u3
2b1b0 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70  2 amt,.  void *p
2b1c0 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Buf.){.  int rc;
2b1d0 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
2b1e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2b1f0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
2b200 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
2b210 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
2b220 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2b230 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
2b240 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  = btreeRestoreCu
2b250 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2b260 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  r);.  return rc 
2b270 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61 79  ? rc : accessPay
2b280 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
2b290 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
2b2a0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2b2b0 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
2b2c0 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
2b2d0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
2b2e0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
2b2f0 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  uf){.  if( pCur-
2b300 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b310 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2b320 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2b330 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2b340 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
2b350 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2b360 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
2b370 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f, 0);.  }else{.
2b380 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73      return acces
2b390 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  sPayloadChecked(
2b3a0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
2b3b0 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a  t, pBuf);.  }.}.
2b3c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2b3d0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
2b3e0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
2b3f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
2b400 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
2b410 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
2b420 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
2b430 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
2b440 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
2b450 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
2b460 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
2b470 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
2b480 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
2b490 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
2b4a0 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
2b4b0 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
2b4c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
2b4d0 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
2b4e0 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
2b4f0 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
2b500 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2b510 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
2b520 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
2b530 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
2b540 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
2b550 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
2b560 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b570 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2b580 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
2b590 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
2b5a0 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
2b5b0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
2b5c0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
2b5d0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
2b5e0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
2b5f0 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
2b600 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
2b610 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
2b620 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
2b630 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
2b640 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
2b650 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
2b660 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
2b670 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
2b680 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
2b690 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
2b6a0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
2b6b0 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
2b6c0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
2b6d0 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
2b6e0 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
2b6f0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
2b700 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
2b710 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
2b720 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
2b730 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
2b740 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
2b750 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
2b760 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
2b770 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
2b780 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
2b790 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2b7a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
2b7b0 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
2b7c0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
2b7d0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
2b7e0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
2b7f0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
2b800 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
2b810 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
2b820 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
2b830 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
2b840 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
2b850 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20  ){.  u32 amt;.  
2b860 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
2b870 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
2b880 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
2b890 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
2b8a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b8b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b8c0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2b8d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2b8e0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2b8f0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2b900 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2b910 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2b920 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b930 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
2b940 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b950 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
2b960 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b970 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
2b980 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b990 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75  nfo.pPayload>pCu
2b9a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b9b0 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c  iPage]->aData ||
2b9c0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
2b9d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b9e0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75  nfo.pPayload<pCu
2b9f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ba00 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64  iPage]->aDataEnd
2ba10 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a   ||CORRUPT_DB);.
2ba20 20 20 61 6d 74 20 3d 20 28 69 6e 74 29 28 70 43    amt = (int)(pC
2ba30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2ba40 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e  >iPage]->aDataEn
2ba50 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d - pCur->info.p
2ba60 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20  Payload);.  if( 
2ba70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
2ba80 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20 70 43  l<amt ) amt = pC
2ba90 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
2baa0 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a  .  *pAmt = amt;.
2bab0 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
2bac0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2bad0 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
2bae0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
2baf0 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
2bb00 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
2bb10 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
2bb20 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
2bb30 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
2bb40 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
2bb50 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
2bb60 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
2bb70 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
2bb80 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
2bb90 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
2bba0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
2bbb0 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
2bbc0 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
2bbd0 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
2bbe0 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
2bbf0 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
2bc00 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
2bc10 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
2bc20 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
2bc30 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
2bc40 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
2bc50 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
2bc60 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
2bc70 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
2bc80 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
2bc90 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
2bca0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
2bcb0 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
2bcc0 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
2bcd0 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
2bce0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
2bcf0 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
2bd00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
2bd10 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
2bd20 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
2bd30 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68  treePayloadFetch
2bd40 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2bd50 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
2bd60 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
2bd70 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
2bd80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
2bd90 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2bda0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
2bdb0 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
2bdc0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2bdd0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
2bde0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
2bdf0 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
2be00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2be10 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2be20 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
2be30 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
2be40 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
2be50 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
2be60 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
2be70 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
2be80 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
2be90 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
2bea0 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
2beb0 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
2bec0 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
2bed0 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
2bee0 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
2bef0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
2bf00 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
2bf10 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
2bf20 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2bf30 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
2bf40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2bf50 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2bf60 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2bf70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2bf80 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2bf90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2bfa0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
2bfb0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
2bfc0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2bfd0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
2bfe0 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
2bff0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
2c000 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c010 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2c020 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  PT;.  }.  pCur->
2c030 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2c040 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2c050 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2c060 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2c070 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69  vfl);.  pCur->ai
2c080 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2b  Idx[pCur->iPage+
2c090 2b 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20  +] = pCur->ix;. 
2c0a0 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20   pCur->ix = 0;. 
2c0b0 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e   return getAndIn
2c0c0 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
2c0d0 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  gno, &pCur->apPa
2c0e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c  ge[pCur->iPage],
2c0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c100 20 20 20 20 20 20 20 20 20 70 43 75 72 2c 20 70           pCur, p
2c110 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
2c120 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  gs);.}..#ifdef S
2c130 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
2c140 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
2c150 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
2c160 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
2c170 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
2c180 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
2c190 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
2c1a0 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
2c1b0 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
2c1c0 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
2c1d0 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
2c1e0 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
2c1f0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
2c200 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
2c210 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
2c220 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2c230 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2c240 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
2c250 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
2c260 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
2c270 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
2c280 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
2c290 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
2c2a0 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52  hild){.  if( COR
2c2b0 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
2c2c0 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74  ;  /* The condit
2c2d0 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f  ions tested belo
2c2e0 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74  w might not be t
2c2f0 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rue.            
2c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c310 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
2c320 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73  database */.  as
2c330 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
2c340 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
2c350 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
2c360 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2c370 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2c380 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2c390 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2c3a0 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
2c3b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c3c0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2c3d0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
2c3e0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
2c3f0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
2c400 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
2c410 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
2c420 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
2c430 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2c440 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
2c450 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
2c460 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
2c470 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
2c480 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
2c490 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
2c4a0 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
2c4b0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
2c4c0 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
2c4d0 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
2c4e0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
2c4f0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
2c500 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
2c510 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
2c520 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
2c530 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
2c540 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
2c550 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2c560 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2c570 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2c580 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2c590 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2c5a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2c5b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2c5c0 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
2c5d0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2c5e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
2c5f0 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
2c600 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
2c610 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2c620 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
2c630 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c640 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
2c650 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c660 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
2c670 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2c680 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c690 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
2c6a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2c6b0 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
2c6c0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2c6d0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2c6e0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2c6f0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2c700 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2c710 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 43  .  pCur->ix = pC
2c720 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c730 69 50 61 67 65 2d 31 5d 3b 0a 20 20 72 65 6c 65  iPage-1];.  rele
2c740 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2c750 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c760 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a  ->iPage--]);.}..
2c770 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2c780 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
2c790 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
2c7a0 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
2c7b0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
2c7c0 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
2c7d0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
2c7e0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
2c7f0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
2c800 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
2c810 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2c820 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
2c830 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
2c840 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
2c850 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
2c860 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
2c870 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
2c880 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
2c890 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
2c8a0 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
2c8b0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
2c8c0 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
2c8d0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
2c8e0 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
2c8f0 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
2c900 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
2c910 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
2c920 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
2c930 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
2c940 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
2c950 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
2c960 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
2c970 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
2c980 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
2c990 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
2c9a0 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
2c9b0 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
2c9c0 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
2c9d0 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
2c9e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2c9f0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
2ca00 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
2ca10 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
2ca20 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
2ca30 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
2ca40 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
2ca50 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
2ca60 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
2ca70 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
2ca80 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
2ca90 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
2caa0 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
2cab0 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
2cac0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
2cad0 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
2cae0 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
2caf0 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
2cb00 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
2cb10 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
2cb20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
2cb30 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
2cb40 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
2cb50 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
2cb60 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
2cb70 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
2cb80 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
2cb90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cba0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
2cbb0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
2cbc0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
2cbd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2cbe0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
2cbf0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2cc00 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2cc10 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
2cc20 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
2cc30 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2cc40 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
2cc50 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
2cc60 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
2cc70 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
2cc80 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
2cc90 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2cca0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2ccb0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
2ccc0 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
2ccd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2cce0 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
2ccf0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2cd00 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
2cd10 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
2cd20 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
2cd30 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
2cd40 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2cd50 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
2cd60 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
2cd70 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
2cd80 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  if( pCur->iPage 
2cd90 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
2cda0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2cdb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2cdc0 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20  iPage]!=0 );.   
2cdd0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2cde0 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
2cdf0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2ce00 2d 2d 5d 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  --]);.      }whi
2ce10 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 29  le( pCur->iPage)
2ce20 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69  ;.      goto ski
2ce30 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20  p_init;.    }.  
2ce40 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
2ce50 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
2ce60 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2ce70 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2ce80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2ce90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2cea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2ceb0 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
2cec0 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  ;.    rc = getAn
2ced0 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
2cee0 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
2cef0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
2cf00 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20  ur->apPage[0],. 
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e         0, pCur->
2cf30 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
2cf40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cf50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
2cf60 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2cf70 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2cf80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2cf90 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
2cfa0 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70  iPage = 0;.    p
2cfb0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d  Cur->curIntKey =
2cfc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2cfd0 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20  ->intKey;.  }.  
2cfe0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
2cff0 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
2d000 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
2d010 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
2d020 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d  ;..  /* If pCur-
2d030 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74  >pKeyInfo is not
2d040 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
2d050 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e  caller that open
2d060 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20  ed this cursor. 
2d070 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
2d080 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
2d090 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
2d0a0 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
2d0b0 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c  fo is.  ** NULL,
2d0c0 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65   the caller expe
2d0d0 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72  cts a table b-tr
2d0e0 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  ee. If this is n
2d0f0 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a  ot the case,.  *
2d100 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
2d110 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
2d120 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72  . .  **.  ** Ear
2d130 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lier versions of
2d140 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20   SQLite assumed 
2d150 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63  that this test c
2d160 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20  ould not fail.  
2d170 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70  ** if the root p
2d180 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  age was already 
2d190 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73  loaded when this
2d1a0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
2d1b0 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20  lled (i.e..  ** 
2d1c0 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  if pCur->iPage>=
2d1d0 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20  0). But this is 
2d1e0 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61  not so if the da
2d1f0 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2d200 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63  ted .  ** in suc
2d210 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67  h a way that pag
2d220 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65  e pRoot is linke
2d230 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20  d into a second 
2d240 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20  b-tree table .  
2d250 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c  ** (or the freel
2d260 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ist).  */.  asse
2d270 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  rt( pRoot->intKe
2d280 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69  y==1 || pRoot->i
2d290 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66  ntKey==0 );.  if
2d2a0 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d  ( pRoot->isInit=
2d2b0 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65  =0 || (pCur->pKe
2d2c0 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74  yInfo==0)!=pRoot
2d2d0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2d2e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2d2f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2d300 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20  .skip_init:  .  
2d310 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
2d320 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2d330 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2d340 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2d350 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2d360 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2d370 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74  dOvfl);..  pRoot
2d380 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d390 30 5d 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  0];.  if( pRoot-
2d3a0 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2d3b0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2d3c0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
2d3d0 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
2d3e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
2d3f0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
2d400 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
2d410 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
2d420 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2d430 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
2d440 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
2d450 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
2d460 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
2d470 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2d480 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2d490 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2d4a0 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
2d4b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2d4c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2d4d0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d  SOR_INVALID;.  }
2d4e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d4f0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2d500 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
2d510 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2d520 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
2d530 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
2d540 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
2d550 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
2d560 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
2d570 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
2d580 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
2d590 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
2d5a0 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
2d5b0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
2d5c0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2d5d0 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
2d5e0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
2d5f0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
2d600 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2d610 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2d620 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2d630 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2d640 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2d650 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2d660 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2d670 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2d680 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
2d690 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d6a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
2d6b0 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
2d6c0 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67  t( pCur->ix<pPag
2d6d0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2d6e0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2d6f0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2d700 70 43 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20  pCur->ix));.    
2d710 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2d720 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
2d730 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2d740 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2d750 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2d760 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
2d770 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
2d780 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
2d790 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
2d7a0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
2d7b0 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
2d7c0 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
2d7d0 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
2d7e0 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
2d7f0 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
2d800 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
2d810 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
2d820 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
2d830 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
2d840 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
2d850 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
2d860 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2d870 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2d880 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
2d890 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
2d8a0 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
2d8b0 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
2d8c0 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
2d8d0 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
2d8e0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
2d8f0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
2d900 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
2d910 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
2d920 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
2d930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
2d940 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2d950 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
2d960 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2d970 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2d980 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2d990 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2d9a0 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61  ;.  while( !(pPa
2d9b0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2d9c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
2d9d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
2d9e0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
2d9f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2da00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2da10 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2da20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2da30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2da40 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
2da50 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2da60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
2da70 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e  ur->ix = pPage->
2da80 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72  nCell-1;.  asser
2da90 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2daa0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ize==0 );.  asse
2dab0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2dac0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2dad0 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65  NKey)==0 );.  re
2dae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2daf0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2db00 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
2db10 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2db20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2db30 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2db40 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2db50 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2db60 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2db70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2db80 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2db90 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2dba0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2dbb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2dbc0 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
2dbd0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2dbe0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
2dbf0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2dc00 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2dc10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2dc20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2dc30 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2dc40 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
2dc50 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2dc60 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2dc70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dc80 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2dc90 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2dca0 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
2dcb0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2dcc0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2dcd0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2dce0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
2dcf0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2dd00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2dd10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2dd20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2dd30 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
2dd40 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2dd50 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2dd60 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2dd70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2dd80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
2dd90 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2dda0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2ddb0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2ddc0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2ddd0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
2dde0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
2ddf0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
2de00 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
2de10 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
2de20 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2de30 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2de40 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2de50 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
2de60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2de70 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2de80 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
2de90 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2dea0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2deb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2dec0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2ded0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2dee0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
2def0 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
2df00 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
2df10 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
2df20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
2df30 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
2df40 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2df50 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
2df60 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2df70 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
2df80 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
2df90 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
2dfa0 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
2dfb0 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
2dfc0 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
2dfd0 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
2dfe0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2dff0 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
2e000 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2e010 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
2e020 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
2e030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2e040 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
2e050 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
2e060 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
2e070 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2e080 72 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 61 70 50  r->ix==pCur->apP
2e090 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e0a0 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
2e0b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2e0c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e0d0 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  e]->leaf );.#end
2e0e0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
2e0f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2e100 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2e110 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2e120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e130 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2e140 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2e150 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
2e160 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2e170 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2e180 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e190 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
2e1a0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2e1b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e1c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e1d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2e1e0 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
2e1f0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2e200 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
2e210 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
2e220 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e230 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
2e240 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2e250 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
2e260 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e270 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2e280 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
2e290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20  ;.      }.   .  
2e2a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2e2b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
2e2c0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
2e2d0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
2e2e0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
2e2f0 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
2e300 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
2e310 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
2e320 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
2e330 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
2e340 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
2e350 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
2e360 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
2e370 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
2e380 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
2e390 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
2e3a0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
2e3b0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
2e3c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
2e3d0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
2e3e0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
2e3f0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
2e400 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
2e410 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
2e420 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
2e430 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
2e440 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
2e450 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
2e460 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
2e470 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
2e480 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
2e490 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
2e4a0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
2e4b0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2e4c0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
2e4d0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
2e4e0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
2e4f0 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
2e500 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
2e510 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
2e520 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
2e530 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
2e540 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
2e550 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
2e560 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
2e570 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
2e580 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2e590 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2e5a0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2e5c0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
2e5d0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
2e5e0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2e5f0 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
2e600 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
2e610 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
2e620 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
2e630 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
2e640 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
2e650 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2e660 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2e670 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2e680 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2e690 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
2e6a0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
2e6b0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
2e6c0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
2e6d0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2e6e0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2e6f0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2e710 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
2e720 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
2e730 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  ** For index tab
2e740 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79  les, the pIdxKey
2e750 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69  ->eqSeen field i
2e760 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  s set to 1 if th
2e770 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e  ere.** exists an
2e780 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2e790 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79  ble that exactly
2e7a0 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79   matches pIdxKey
2e7b0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
2e7c0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
2e7d0 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
2e7e0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2e7f0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2e800 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
2e810 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2e820 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
2e830 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
2e840 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
2e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e860 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
2e870 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
2e880 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
2e890 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
2e8a0 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
2e8b0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
2e8c0 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
2e8d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2e8e0 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
2e8f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2e900 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70  rc;.  RecordComp
2e910 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  are xRecordCompa
2e920 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  re;..  assert( c
2e930 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2e940 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2e950 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2e960 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2e970 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2e980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2e990 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
2e9a0 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2e9b0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
2e9c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2e9d0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2e9e0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49  SOR_VALID || (pI
2e9f0 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2ea00 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20  ->curIntKey!=0) 
2ea10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2ea20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
2ea30 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
2ea40 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
2ea50 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
2ea60 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
2ea70 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
2ea80 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
2ea90 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65   */.  if( pIdxKe
2eaa0 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d  y==0.   && pCur-
2eab0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2eac0 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
2ead0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2eae0 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
2eaf0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2eb00 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2eb10 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
2eb20 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
2eb30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2eb40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2eb50 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
2eb60 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Key ){.      if(
2eb70 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2eb80 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2eb90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
2eba0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
2ebb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ebc0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2ebd0 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
2ebe0 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65  ested key is one
2ebf0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70   more than the p
2ec00 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65  revious key, the
2ec10 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74  n.      ** try t
2ec20 6f 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e  o get there usin
2ec30 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  g sqlite3BtreeNe
2ec40 78 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e  xt() rather than
2ec50 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a   a full.      **
2ec60 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20   binary search. 
2ec70 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
2ec80 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20  mization only.  
2ec90 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  The correct answ
2eca0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  er.      ** is s
2ecb0 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69  till obtained wi
2ecc0 74 68 6f 75 74 20 74 68 69 73 20 61 73 65 2c 20  thout this ase, 
2ecd0 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f  only a little mo
2ece0 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20  re slowely */.  
2ecf0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2ed00 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65  fo.nKey+1==intKe
2ed10 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70  y && !pCur->skip
2ed20 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
2ed30 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2ed40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2ed50 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2ed60 52 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Res);.        if
2ed70 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ed80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
2ed90 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Res==0 ){.      
2eda0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
2edb0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  pCur);.         
2edc0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2edd0 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
2ede0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2edf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ee00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ee10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ee20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64  }.  }..  if( pId
2ee30 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63  xKey ){.    xRec
2ee40 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c  ordCompare = sql
2ee50 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
2ee60 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  are(pIdxKey);.  
2ee70 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f    pIdxKey->errCo
2ee80 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  de = 0;.    asse
2ee90 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66  rt( pIdxKey->def
2eea0 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20  ault_rc==1 .    
2eeb0 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2eec0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a  >default_rc==0 .
2eed0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2eee0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2eef0 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  =-1.    );.  }el
2ef00 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43  se{.    xRecordC
2ef10 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41  ompare = 0; /* A
2ef20 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65  ll keys are inte
2ef30 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72  gers */.  }..  r
2ef40 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2ef50 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
2ef60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2ef70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2ef80 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2ef90 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2efa0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
2efb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2efc0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2efd0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2efe0 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
2eff0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2f000 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2f010 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
2f020 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2f030 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
2f040 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2f050 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2f060 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
2f070 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
2f080 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2f090 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2f0a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2f0b0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
2f0c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2f0d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
2f0e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2f0f0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
2f100 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2f110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2f120 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
2f130 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
2f140 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
2f150 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a  r, upr, idx, c;.
2f160 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
2f170 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2f180 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2f190 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2f1a0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20  .    u8 *pCell; 
2f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2f1d0 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63  ter to current c
2f1e0 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
2f1f0 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e  .    /* pPage->n
2f200 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65  Cell must be gre
2f210 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20  ater than zero. 
2f220 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
2f230 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
2f240 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  the cursor would
2f250 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c   have been INVAL
2f260 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69  ID above and thi
2f270 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20  s for(;;) loop. 
2f280 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49     ** not run. I
2f290 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2f2a0 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65  e root-page, the
2f2b0 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c  n the moveToChil
2f2c0 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  d() routine.    
2f2d0 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c  ** would have al
2f2e0 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64  ready detected d
2f2f0 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69  b corruption. Si
2f300 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d  milarly, pPage m
2f310 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
2f320 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e  e right kind (in
2f330 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66  dex or table) of
2f340 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74   b-tree page. Ot
2f350 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61  herwise.    ** a
2f360 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f   moveToChild() o
2f370 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63  r moveToRoot() c
2f380 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64  all would have d
2f390 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
2f3a0 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  on.  */.    asse
2f3b0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2f3c0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
2f3d0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ( pPage->intKey=
2f3e0 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b  =(pIdxKey==0) );
2f3f0 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
2f400 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
2f410 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65  Cell-1;.    asse
2f420 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30  rt( biasRight==0
2f430 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31   || biasRight==1
2f440 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70   );.    idx = up
2f450 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29  r>>(1-biasRight)
2f460 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52  ; /* idx = biasR
2f470 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77  ight ? upr : (lw
2f480 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2f490 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2f4a0 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52  )idx;.    if( xR
2f4b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20  ecordCompare==0 
2f4c0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  ){.      for(;;)
2f4d0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43  {.        i64 nC
2f4e0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2f4f0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2f500 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69  PastPtr(pPage, i
2f510 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
2f520 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
2f530 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2f540 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a  while( 0x80 <= *
2f550 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20  (pCell++) ){.   
2f560 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
2f570 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  ll>=pPage->aData
2f580 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  End ) return SQL
2f590 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f5c0 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
2f5d0 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
2f5e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
2f5f0 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
2f600 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
2f610 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
2f620 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2f630 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  { c = -1; break;
2f640 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2f650 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e   if( nCellKey>in
2f660 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2f670 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2f680 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
2f690 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20  >upr ){ c = +1; 
2f6a0 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
2f6b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f6c0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
2f6d0 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ey==intKey );.  
2f6e0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
2f6f0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2f700 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2f710 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2f720 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2f730 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2f740 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
2f750 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
2f760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f770 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2f780 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2f790 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2f7a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2f7b0 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
2f7c0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2f7d0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2f7e0 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
2f7f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2f800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f810 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2f820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f830 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2f840 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2f850 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2f860 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2f870 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2f880 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2f890 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2f8a0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
2f8b0 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74  l;  /* Size of t
2f8c0 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e  he pCell cell in
2f8d0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
2f8e0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2f8f0 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
2f900 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20   idx);..        
2f910 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
2f920 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
2f930 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
2f940 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
2f950 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
2f960 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
2f970 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
2f980 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
2f990 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
2f9a0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
2f9b0 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
2f9c0 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
2f9d0 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
2f9e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
2f9f0 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
2fa00 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
2fa10 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
2fa20 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
2fa30 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2fa40 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
2fa50 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
2fa60 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
2fa70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
2fa80 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
2fa90 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
2faa0 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
2fab0 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
2fac0 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
2fad0 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
2fae0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2faf0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c     nCell = pCell
2fb00 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
2fb10 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
2fb20 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29  ax1bytePayload )
2fb30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2fb40 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
2fb50 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
2fb60 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
2fb70 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
2fb80 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
2fb90 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2fba0 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
2fbb0 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2fbc0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2fbd0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2fbe0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2fbf0 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2fc00 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
2fc10 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2fc20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2fc30 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2fc40 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
2fc50 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2fc60 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
2fc70 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
2fc80 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
2fc90 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
2fca0 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
2fcb0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
2fcc0 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
2fcd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2fce0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2fcf0 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
2fd00 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2fd10 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
2fd20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2fd30 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
2fd40 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2fd50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2fd60 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
2fd70 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2fd80 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2fd90 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2fda0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2fdb0 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
2fdc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2fdd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fde0 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
2fdf0 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
2fe00 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
2fe10 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
2fe20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
2fe30 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
2fe40 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
2fe50 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
2fe60 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
2fe70 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
2fe80 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
2fe90 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
2fea0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
2feb0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
2fec0 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
2fed0 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
2fee0 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20  called. .       
2fef0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2ff00 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  ** If the record
2ff10 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65   is corrupt, the
2ff20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2ff30 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64  routine may read
2ff40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70  .          ** up
2ff50 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20   to two varints 
2ff60 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2ff70 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65  the buffer. An e
2ff80 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20  xtra 18 .       
2ff90 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
2ffa0 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61  adding is alloca
2ffb0 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ted at the end o
2ffc0 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a  f the buffer in.
2ffd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
2ffe0 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20  e this happens. 
2fff0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
30000 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
30010 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
30020 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
30030 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
30040 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
30050 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
30060 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
30070 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
30080 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
30090 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
300a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
300b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
300c0 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20  se( nCell<0 );  
300d0 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20   /* True if key 
300e0 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20  size is 2^32 or 
300f0 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  more */.        
30100 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
30110 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==0 );  /* Inva
30120 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
30130 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f  x80 0x80 0x00 */
30140 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
30150 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b  ase( nCell==1 );
30160 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
30170 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
30180 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20  0 0x01 */.      
30190 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
301a0 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69  ell==2 );  /* Mi
301b0 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65  nimum legal inde
301c0 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20  x key size */.  
301d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
301e0 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<2 ){.         
301f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
30200 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
30210 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
30220 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
30230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30240 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
30250 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
30260 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20  ll+18 );.       
30270 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
30280 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
30290 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
302a0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
302b0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
302c0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
302d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
302e0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
302f0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72  idx;.          r
30300 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
30310 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
30320 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
30330 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a  *)pCellKey, 0);.
30340 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
30350 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
30360 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
30370 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
30380 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
30390 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
303a0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
303b0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
303c0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
303d0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
303e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
303f0 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
30400 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
30410 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
30420 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
30430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
30440 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20  ert( .          
30450 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43    (pIdxKey->errC
30460 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ode!=SQLITE_CORR
30470 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20  UPT || c==0).   
30480 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65        && (pIdxKe
30490 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
304a0 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72  TE_NOMEM || pCur
304b0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61  ->pBtree->db->ma
304c0 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20  llocFailed).    
304d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
304e0 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
304f0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
30500 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
30510 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
30520 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
30530 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30540 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
30550 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( c==0 );.      
30560 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
30570 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
30580 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
30590 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
305a0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
305b0 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65    if( pIdxKey->e
305c0 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51  rrCode ) rc = SQ
305d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
305e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
305f0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
30600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
30610 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61  ( lwr>upr ) brea
30620 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
30630 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
30640 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
30650 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
30660 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
30670 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  /2 */.      }.  
30680 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
30690 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70  lwr==upr+1 || (p
306a0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
306b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b  !pPage->leaf) );
306c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
306d0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
306e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
306f0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
30700 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72  t( pCur->ix<pCur
30710 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
30720 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
30730 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d        pCur->ix =
30740 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
30750 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
30760 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30770 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
30780 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
30790 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
307a0 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
307b0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
307c0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
307d0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
307e0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
307f0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
30800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
30810 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
30820 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
30830 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
30840 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
30850 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
30860 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
30870 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
30880 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
30890 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
308a0 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
308b0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  Size = 0;.  asse
308c0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
308d0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
308e0 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65  Ovfl)==0 );.  re
308f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
30900 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
30910 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
30920 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
30930 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
30940 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
30950 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
30960 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
30970 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
30980 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
30990 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
309a0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
309b0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
309c0 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
309d0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
309e0 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
309f0 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
30a00 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
30a10 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
30a20 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
30a30 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
30a40 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
30a50 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
30a60 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
30a70 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
30a80 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
30a90 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
30aa0 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
30ab0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
30ac0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
30ad0 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
30ae0 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
30af0 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
30b00 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
30b10 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
30b20 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
30b30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73  .** Return an es
30b40 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e  timate for the n
30b50 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
30b60 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
30b70 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74  pCur is.** point
30b80 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20  ing to.  Return 
30b90 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
30ba0 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65  r if no estimate
30bb0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a   is currently .*
30bc0 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  * available..*/.
30bd0 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
30be0 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75  RowCountEst(BtCu
30bf0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
30c00 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20  64 n;.  u8 i;.. 
30c10 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
30c20 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
30c30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
30c40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30c50 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
30c60 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
30c70 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68   /* Currently th
30c80 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  is interface is 
30c90 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74  only called by t
30ca0 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a  he OP_IfSmaller.
30cb0 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64    ** opcode, and
30cc0 20 69 74 20 74 68 61 74 20 63 61 73 65 20 74 68   it that case th
30cd0 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c  e cursor will al
30ce0 77 61 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e  ways be valid an
30cf0 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61  d.  ** will alwa
30d00 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65  ys point to a le
30d10 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66  af node. */.  if
30d20 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53  ( NEVER(pCur->eS
30d30 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
30d40 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ID) ) return -1;
30d50 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
30d60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
30d70 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 29  iPage]->leaf==0)
30d80 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20   ) return -1;.. 
30d90 20 66 6f 72 28 6e 3d 31 2c 20 69 3d 30 3b 20 69   for(n=1, i=0; i
30da0 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
30db0 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43  ++){.    n *= pC
30dc0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e  ur->apPage[i]->n
30dd0 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cell;.  }.  retu
30de0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn n;.}../*.** A
30df0 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
30e00 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
30e10 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
30e20 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
30e30 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
30e40 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
30e50 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
30e60 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
30e70 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
30e80 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
30e90 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
30ea0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
30eb0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
30ec0 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
30ed0 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
30ee0 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
30ef0 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
30f00 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
30f10 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
30f20 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
30f30 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
30f40 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
30f50 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
30f60 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
30f70 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
30f80 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
30f90 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
30fa0 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
30fb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
30fc0 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
30fd0 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
30fe0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
30ff0 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
31000 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
31010 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
31020 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
31030 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
31040 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
31050 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
31060 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
31070 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
31080 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
31090 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
310a0 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
310b0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
310c0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
310d0 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
310e0 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
310f0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
31100 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
31110 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
31120 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
31130 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
31140 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
31150 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
31160 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
31170 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
31180 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
31190 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
311a0 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
311b0 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
311c0 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
311d0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
311e0 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
311f0 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
31200 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
31210 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
31220 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
31230 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
31240 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
31250 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
31260 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
31270 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
31280 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
31290 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
312a0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
312b0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
312c0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
312d0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
312e0 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
312f0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
31300 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
31310 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69   *pRes==0 );.  i
31320 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
31330 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
31340 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
31350 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
31360 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
31370 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  0 );.    rc = re
31380 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
31390 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
313a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
313b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
313c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
313d0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
313e0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
313f0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
31400 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
31410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31420 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
31430 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
31440 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
31450 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
31460 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
31470 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
31480 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
31490 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
314a0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
314b0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
314c0 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  Next>0 ){.      
314d0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
314e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
314f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
31510 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
31520 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
31530 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
31540 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
31550 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
31560 2d 3e 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20  ->ix;.  assert( 
31570 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
31580 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
31590 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
315a0 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
315b0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
315c0 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
315d0 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
315e0 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
315f0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
31600 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
31610 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
31620 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
31630 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
31640 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
31650 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
31660 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
31670 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
31680 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
31690 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
316a0 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
316b0 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
316c0 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
316d0 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
316e0 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
316f0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20  nCell );..  if( 
31700 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
31710 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
31720 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
31730 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
31740 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
31750 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
31760 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
31770 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
31780 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31790 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
317a0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
317b0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ur);.    }.    d
317c0 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
317d0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
317e0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
317f0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
31800 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
31810 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
31820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31830 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
31840 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
31850 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
31860 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
31870 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
31880 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
31890 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ix>=pPage->nCell
318a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
318b0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
318c0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
318d0 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
318e0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
318f0 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
31900 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
31910 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
31920 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
31930 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
31950 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
31960 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
31970 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
31980 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
31990 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
319a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
319b0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  e;.  assert( cur
319c0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
319d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
319e0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
319f0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
31a00 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
31a10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
31a20 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
31a30 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
31a40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
31a50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
31a60 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
31a70 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
31a80 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
31a90 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52  alidOvfl);.  *pR
31aa0 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  es = 0;.  if( pC
31ab0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
31ac0 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
31ad0 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
31ae0 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65  , pRes);.  pPage
31af0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
31b00 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
31b10 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29  if( (++pCur->ix)
31b20 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
31b30 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  {.    pCur->ix--
31b40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
31b50 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
31b60 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  s);.  }.  if( pP
31b70 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
31b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31b90 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
31ba0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
31bb0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
31bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
31bd0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
31be0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
31bf0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
31c00 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
31c10 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
31c20 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
31c30 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
31c40 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
31c50 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
31c60 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
31c70 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
31c80 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
31c90 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
31ca0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
31cb0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
31cc0 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
31cd0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
31ce0 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  us().  That rout
31cf0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
31d00 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
31d10 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
31d20 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74  y decrementing t
31d30 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
31d40 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
31d50 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  * to the previou
31d60 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  s cell on the cu
31d70 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
31d80 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50   (slower) btreeP
31d90 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c  revious().** hel
31da0 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63  per routine is c
31db0 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
31dc0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
31dd0 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
31de0 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20  t page.** or to 
31df0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
31e00 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
31e10 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77  lling function w
31e20 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ill set *pRes to
31e30 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e   0 or 1.  The in
31e40 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
31e50 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69  e.** will be 1 i
31e60 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69  f the cursor bei
31e70 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65  ng stepped corre
31e80 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
31e90 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66   index and.** if
31ea0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
31eb0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b  uld have been sk
31ec0 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51  ipped if that SQ
31ed0 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
31ee0 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64  .** a unique ind
31ef0 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ex.  Otherwise t
31f00 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  he caller will h
31f10 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ave set *pRes to
31f20 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69   zero..** Zero i
31f30 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
31f40 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70  e. The btree imp
31f50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66  lementation is f
31f60 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  ree to use the.*
31f70 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  * initial *pRes 
31f80 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20  value as a hint 
31f90 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  to improve perfo
31fa0 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20  rmance, but the 
31fb0 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74  current.** SQLit
31fc0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
31fd0 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e  tation does not.
31fe0 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20   (Note that the 
31ff0 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20  comdb2 btree.** 
32000 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
32010 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e  oes use this hin
32020 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a  t, however.).*/.
32030 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
32040 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
32050 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
32060 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
32070 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
32080 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
32090 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
320a0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
320b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
320c0 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
320d0 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
320e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
320f0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
32100 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
32110 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
32120 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
32130 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
32140 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
32150 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
32160 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
32170 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
32180 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
32190 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
321a0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
321b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
321c0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
321d0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
321e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
321f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
32200 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
32210 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
32220 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
32230 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
32240 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
32250 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
32260 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
32270 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
32280 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
32290 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
322a0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
322b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
322c0 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
322d0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
322e0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
322f0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
32300 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ext<0 ){.       
32310 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
32320 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
32330 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
32340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
32350 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
32360 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
32370 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
32380 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
32390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
323a0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
323b0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
323c0 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
323d0 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63  pCur->ix;.    rc
323e0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
323f0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
32400 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
32410 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
32420 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
32430 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
32440 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
32450 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
32460 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b  ( pCur->ix==0 ){
32470 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
32480 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
32490 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
324a0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
324b0 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
324c0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
324d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
324e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
324f0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
32500 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
32510 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
32520 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
32530 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
32540 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
32550 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
32560 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ;..    pCur->ix-
32570 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
32580 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
32590 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
325a0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
325b0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
325c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
325d0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
325e0 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
325f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32600 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32610 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
32620 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
32630 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
32640 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
32650 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
32660 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
32670 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
32680 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
32690 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
326a0 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
326b0 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
326c0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
326d0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
326e0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
326f0 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73  VALID );.  *pRes
32700 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
32710 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
32720 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
32730 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
32740 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
32750 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
32760 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
32770 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
32780 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
32790 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  =0.   || pCur->a
327a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
327b0 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  e]->leaf==0.  ){
327c0 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
327d0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
327e0 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75  pRes);.  }.  pCu
327f0 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72  r->ix--;.  retur
32800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
32810 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
32820 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
32830 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32840 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
32850 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
32860 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
32870 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
32880 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
32890 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
328a0 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
328b0 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
328c0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
328d0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
328e0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
328f0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
32900 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
32910 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
32920 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
32930 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
32940 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
32950 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
32960 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
32970 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
32980 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
32990 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
329a0 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
329b0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
329c0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
329d0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
329e0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
329f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
32a00 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
32a10 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
32a20 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
32a30 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
32a40 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
32a50 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
32a60 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
32a70 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
32a80 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
32a90 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
32aa0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
32ab0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
32ac0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
32ad0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
32ae0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
32af0 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
32b00 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
32b10 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
32b20 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
32b30 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
32b40 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
32b50 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
32b60 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
32b70 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
32b80 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
32b90 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
32ba0 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
32bb0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
32bc0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
32bd0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
32be0 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
32bf0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
32c00 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
32c10 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
32c20 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
32c30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
32c40 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
32c50 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
32c60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
32c70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
32c80 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
32c90 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
32ca0 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
32cb0 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
32cc0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
32cd0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
32ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
32cf0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
32d00 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
32d10 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
32d20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
32d30 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
32d40 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
32d50 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
32d60 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
32d70 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
32d80 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
32d90 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
32da0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
32db0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
32dc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
32dd0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
32de0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
32df0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
32e00 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
32e10 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
32e20 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
32e30 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
32e40 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
32e50 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
32e60 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
32e70 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
32e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
32e90 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
32ea0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
32eb0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
32ec0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
32ed0 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
32ee0 65 61 72 62 79 3e 30 20 26 26 20 52 45 51 55 49  earby>0 && REQUI
32ef0 52 45 5f 50 54 52 4d 41 50 20 29 20 29 3b 0a 20  RE_PTRMAP ) );. 
32f00 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
32f10 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
32f20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
32f30 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44  (pBt);.  /* EVID
32f40 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39  ENCE-OF: R-05119
32f50 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74  -02637 The 4-byt
32f60 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
32f70 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
32f80 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74  6.  ** stores st
32f90 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  ores the total n
32fa0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
32fb0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
32fc0 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  */.  n = get4byt
32fd0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
32fe0 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
32ff0 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
33000 3b 0a 20 20 69 66 28 20 49 53 43 4f 4e 43 55 52  ;.  if( ISCONCUR
33010 52 45 4e 54 3d 3d 30 20 26 26 20 6e 3e 3d 6d 78  RENT==0 && n>=mx
33020 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
33030 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
33040 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
33050 2a 20 45 6e 73 75 72 65 20 70 61 67 65 20 31 20  * Ensure page 1 
33060 69 73 20 77 72 69 74 61 62 6c 65 2e 20 54 68 69  is writable. Thi
33070 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
33080 65 69 74 68 65 72 20 63 68 61 6e 67 65 20 74 68  either change th
33090 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
330a0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 72   pages in the fr
330b0 65 65 2d 6c 69 73 74 20 6f 72 20 74 68 65 20 73  ee-list or the s
330c0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
330d0 61 73 65 20 66 69 6c 65 2e 20 53 69 6e 63 65 20  ase file. Since 
330e0 62 6f 74 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  both.  ** of the
330f0 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e  se operations in
33100 76 6f 6c 76 65 20 6d 6f 64 69 66 79 69 6e 67 20  volve modifying 
33110 70 61 67 65 20 31 20 68 65 61 64 65 72 20 66 69  page 1 header fi
33120 65 6c 64 73 2c 20 70 61 67 65 20 31 0a 20 20 2a  elds, page 1.  *
33130 2a 20 77 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c  * will definitel
33140 79 20 62 65 20 77 72 69 74 74 65 6e 20 62 79 20  y be written by 
33150 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
33160 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
33170 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20  CONCURRENT.  ** 
33180 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73  transaction, ens
33190 75 72 65 20 74 68 65 20 42 74 72 65 65 50 74 72  ure the BtreePtr
331a0 6d 61 70 20 73 74 72 75 63 74 75 72 65 20 68 61  map structure ha
331b0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
331c0 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
331d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
331e0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
331f0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
33200 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e  rn rc;..  if( n>
33210 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
33220 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
33230 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
33240 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
33250 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
33260 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
33270 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
33280 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
33290 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
332a0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
332b0 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
332c0 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
332d0 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
332e0 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
332f0 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
33300 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
33310 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
33320 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
33330 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
33340 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
33350 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
33360 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
33370 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
33380 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
33390 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
333a0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
333b0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
333c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f    */.    if( eMo
333d0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
333e0 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
333f0 74 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 21  t( ISAUTOVACUUM!
33400 3d 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b  =ISCONCURRENT );
33410 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
33420 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
33430 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
33440 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
33450 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
33460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
33470 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
33480 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
33490 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
334a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
334b0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
334c0 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
334d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
334e0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
334f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 54            if( eT
33500 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
33510 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
33520 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
33530 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
33540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
33560 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
33570 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
33580 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
33590 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
335a0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
335b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
335c0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
335d0 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
335e0 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
335f0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
33600 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
33610 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
33620 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
33630 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
33640 20 20 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79     */.    put4by
33650 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
33660 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
33670 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
33680 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
33690 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
336a0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
336b0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
336c0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
336d0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
336e0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
336f0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
33700 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
33710 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
33720 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
33730 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
33740 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
33750 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
33760 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
33770 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
33780 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
33790 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
337a0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
337b0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
337c0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
337d0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
337e0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
337f0 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
33800 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
33810 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
33820 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
33830 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
33840 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
33850 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
33860 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
33870 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
33880 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
33890 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
338a0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
338b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
338c0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
338d0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
338e0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
338f0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
33900 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
33910 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
33920 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
33930 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
33940 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
33950 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
33960 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
33970 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
33980 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
33990 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
339a0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
339b0 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
339c0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
339d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
339e0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
339f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
33a00 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
33a10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
33a20 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
33a30 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
33a40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
33a50 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33a60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33a70 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
33a80 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
33a90 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
33aa0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
33ab0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
33ac0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
33ad0 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
33ae0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
33af0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
33b00 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
33b10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
33b20 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
33b30 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f  ta!=0 );.      /
33b40 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
33b50 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65  -13523-04394 The
33b60 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20   second integer 
33b70 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
33b80 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a  unk page.      *
33b90 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
33ba0 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69  of leaf page poi
33bb0 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e  nters to follow.
33bc0 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   */.      k = ge
33bd0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
33be0 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
33bf0 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
33c00 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
33c10 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
33c20 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
33c30 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
33c40 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
33c50 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
33c60 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
33c70 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
33c80 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
33c90 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
33ca0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
33cb0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
33cc0 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
33cd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
33ce0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33cf0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
33d00 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
33d10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
33d20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
33d30 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
33d40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
33d50 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
33d60 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
33d70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
33d80 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
33d90 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
33da0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
33db0 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
33dc0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
33dd0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
33de0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
33df0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
33e00 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
33e10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
33e20 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
33e30 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
33e40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
33e50 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
33e60 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
33e70 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
33e80 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
33e90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33ea0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
33eb0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
33ec0 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
33ed0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33ee0 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
33ef0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a  if( searchList .
33f00 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
33f10 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c  nearby==iTrunk |
33f20 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79  | (iTrunk<nearby
33f30 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
33f40 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29  OC_LE)) .      )
33f50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
33f60 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
33f70 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
33f80 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
33f90 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
33fa0 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
33fb0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
33fc0 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
33fd0 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
33fe0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
33ff0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
34000 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
34010 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
34020 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
34030 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34040 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
34050 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
34060 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
34070 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
34080 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
34090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
340a0 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
340b0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
340c0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
340d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
340e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
340f0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
34100 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
34110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34120 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34130 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
34140 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
34150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
34160 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34180 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
34190 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
341a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
341b0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
341c0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
341d0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
341e0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
341f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
34200 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
34210 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
34220 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
34230 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
34240 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
34250 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
34260 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
34270 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
34280 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
34290 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
342a0 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
342b0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
342c0 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
342d0 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
342e0 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
342f0 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
34300 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
34310 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
34320 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
34330 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
34340 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
34350 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34360 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
34370 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
34380 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
34390 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
343a0 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
343b0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
343c0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
343d0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
343e0 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
343f0 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
34400 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34420 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
34430 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
34440 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34450 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34460 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
34470 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
34480 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
34490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
344a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
344b0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
344c0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
344d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
344e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
344f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
34500 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
34510 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
34520 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
34530 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
34540 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
34550 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
34560 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
34570 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
34580 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
34590 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
345a0 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
345b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
345c0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
345d0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
345e0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
345f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34600 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34610 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
34620 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
34630 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
34640 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
34650 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
34660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34670 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34680 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34690 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
346a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
346b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
346c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
346d0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
346e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
346f0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
34700 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
34710 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
34720 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
34730 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
34740 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
34750 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
34760 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
34770 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
34780 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
34790 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
347a0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
347b0 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
347c0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
347d0 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
347e0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
347f0 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
34800 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
34810 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
34820 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
34830 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
34840 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
34850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
34860 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
34870 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
34880 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
34890 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
348a0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
348b0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
348c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
348d0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
348e0 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
348f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
34900 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
34910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34920 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
34930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
34940 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
34950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
34960 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
34970 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
34980 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
34990 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
349a0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
349b0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
349c0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
349d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
349e0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
349f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
34a00 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
34a10 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
34a20 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
34a30 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
34a40 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
34a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
34a60 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
34a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a80 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
34a90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34ab0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
34ac0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
34ad0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
34ae0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
34af0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
34b00 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
34b10 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
34b20 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
34b30 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
34b40 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
34b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
34b60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34b70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
34b80 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
34b90 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
34ba0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
34bb0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
34bc0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
34bd0 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a  f( !searchList .
34be0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61           || (iPa
34bf0 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69  ge==nearby || (i
34c00 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65  Page<nearby && e
34c10 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
34c20 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  )) .        ){. 
34c30 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
34c40 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
34c50 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
34c60 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
34c70 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
34c80 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
34c90 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
34ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cb0 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
34cc0 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
34cd0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
34ce0 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
34cf0 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
34d00 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
34d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34d20 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
34d30 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
34d40 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
34d50 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
34d60 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
34d70 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
34d80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
34d90 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
34da0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
34db0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
34dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34dd0 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
34de0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
34df0 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
34e00 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
34e10 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
34e20 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  no)? PAGER_GET_N
34e30 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
34e40 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
34e50 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
34e60 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
34e70 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
34e80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
34e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34ea0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
34eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34ec0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
34ed0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
34ee0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34ef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34f00 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
34f10 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
34f20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61             *ppPa
34f30 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
34f40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34f50 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
34f60 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
34f70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34f80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34f90 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
34fa0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
34fb0 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
34fc0 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
34fd0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
34fe0 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
34ff0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
35000 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77   so append a new
35010 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20   page to the.   
35020 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
35030 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
35040 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20  * Normally, new 
35050 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  pages allocated 
35060 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61  by this block ca
35070 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66  n be requested f
35080 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  rom the.    ** p
35090 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
350a0 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
350b0 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20   flag set. This 
350c0 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
350d0 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  er.    ** from t
350e0 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68  rying to read th
350f0 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20  e pages content 
35100 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76  from disk. Howev
35110 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  er, if the.    *
35120 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  * current transa
35130 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
35140 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72  y run one or mor
35150 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  e incremental-va
35160 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70  cuum.    ** step
35170 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  s, then the page
35180 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
35190 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f   allocate may co
351a0 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20  ntain content.  
351b0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71    ** that is req
351c0 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  uired in the eve
351d0 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
351e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
351f0 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65  do.    ** not se
35200 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  t the no-content
35210 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73   flag. This caus
35220 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
35230 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  load and journal
35240 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
35250 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
35260 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
35270 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20  ing it..    **. 
35280 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
35290 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e  the pager will n
352a0 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65  ot actually atte
352b0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a  mpt to load or j
352c0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63  ournal .    ** c
352d0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70  ontent for any p
352e0 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20  age that really 
352f0 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68  does lie past th
35300 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
35310 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
35320 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68  e on disk. So th
35330 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73  e effects of dis
35340 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f  abling the no-co
35350 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  ntent optimizati
35360 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61  on.    ** here a
35370 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74  re confined to t
35380 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20  hose pages that 
35390 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  lie between the 
353a0 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
353b0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
353c0 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20   and the end of 
353d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
353e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
353f0 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  t bNoContent = (
35400 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  0==IfNotOmitAV(p
35410 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
35420 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
35430 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72  ONTENT:0;..    r
35440 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35450 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
35460 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
35470 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
35480 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
35490 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
354a0 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
354b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
354c0 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
354d0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
354e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
354f0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
35500 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
35510 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
35520 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
35530 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
35540 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
35550 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
35560 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
35570 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
35580 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
35590 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
355a0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
355b0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
355c0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
355d0 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
355e0 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
355f0 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
35600 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
35610 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
35620 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
35630 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
35640 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
35650 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
35660 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
35670 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
35680 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
35690 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
356a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
356b0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
356c0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
356d0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20  Bt, pBt->nPage, 
356e0 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  &pPg, bNoContent
356f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
35700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35710 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35720 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
35730 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
35740 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35750 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
35760 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
35770 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42  urn rc;.      pB
35780 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
35790 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
357a0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
357b0 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d  AGE(pBt) ){ pBt-
357c0 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20  >nPage++; }.    
357d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74  }.#endif.    put
357e0 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29  4byte(28 + (u8*)
357f0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
35800 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ta, pBt->nPage);
35810 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42  .    *pPgno = pB
35820 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61  t->nPage;..    a
35830 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
35840 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
35850 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
35860 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
35870 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
35880 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e  , ppPage, bNoCon
35890 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  tent);.    if( r
358a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
358b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
358c0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
358d0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
358e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
358f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
35900 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
35910 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
35920 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
35930 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
35940 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
35950 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
35960 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
35970 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
35980 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
35990 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
359a0 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
359b0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
359c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
359d0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73  PrevTrunk);.  as
359e0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
359f0 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  _OK || sqlite3Pa
35a00 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
35a10 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
35a20 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65  ge)<=1 );.  asse
35a30 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
35a40 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  K || (*ppPage)->
35a50 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
35a60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
35a70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
35a80 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
35a90 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
35aa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35ab0 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
35ac0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
35ad0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
35ae0 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
35af0 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
35b00 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
35b10 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
35b20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
35b30 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
35b40 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
35b50 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
35b60 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
35b70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35b80 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
35b90 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
35ba0 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
35bb0 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
35bc0 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
35bd0 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
35be0 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
35bf0 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
35c00 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
35c10 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
35c20 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
35c30 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
35c40 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
35c50 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
35c60 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
35c70 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
35c80 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
35c90 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
35ca0 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
35cb0 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
35cc0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
35cd0 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
35ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
35cf0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
35d00 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
35d10 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
35d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
35d30 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
35d40 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
35d50 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
35d60 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
35d70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
35d80 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
35d90 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
35da0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
35db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35dc0 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
35dd0 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
35de0 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
35df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35e10 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
35e20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
35e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e40 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
35e50 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
35e60 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
35e70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35e80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
35e90 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
35ea0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
35eb0 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a  B || iPage>1 );.
35ec0 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
35ed0 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
35ee0 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
35ef0 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 29  .  if( iPage<2 )
35f00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
35f10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69  ORRUPT_BKPT;.  i
35f20 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
35f30 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
35f40 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
35f50 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
35f60 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
35f70 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
35f80 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
35f90 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
35fa0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
35fb0 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
35fc0 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
35fd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
35fe0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
35ff0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
36000 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
36010 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
36020 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
36030 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
36040 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
36050 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
36060 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
36070 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
36080 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
36090 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ETE ){.    /* If
360a0 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
360b0 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
360c0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
360d0 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
360e0 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
360f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
36100 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
36110 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
36120 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
36130 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
36140 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
36150 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
36160 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
36170 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36180 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
36190 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
361a0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
361b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
361c0 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
361d0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
361e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
361f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
36200 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
36210 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
36220 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
36230 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
36240 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
36250 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
36260 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
36270 69 66 28 20 52 45 51 55 49 52 45 5f 50 54 52 4d  if( REQUIRE_PTRM
36280 41 50 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  AP ){.    ptrmap
36290 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
362a0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
362b0 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
362c0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
362d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
362e0 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
362f0 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
36300 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
36310 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
36320 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
36330 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
36340 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
36350 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
36360 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
36370 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
36380 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
36390 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
363a0 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
363b0 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
363c0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
363d0 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
363e0 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
363f0 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
36400 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
36410 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
36420 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
36430 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
36440 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
36450 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
36460 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
36470 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
36480 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
36490 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
364a0 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
364b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
364c0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
364d0 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
364e0 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
364f0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
36500 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
36510 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
36520 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
36530 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
36540 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
36550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36560 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
36570 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
36580 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
36590 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
365a0 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
365b0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
365c0 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
365d0 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
365e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
365f0 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
36600 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
36610 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
36620 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
36630 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
36640 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
36650 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
36660 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
36670 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
36680 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
36690 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
366a0 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
366b0 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
366c0 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
366d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
366e0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
366f0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
36700 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
36710 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
36720 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
36730 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
36740 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
36750 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
36760 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
36770 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
36780 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
36790 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
367a0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
367b0 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
367c0 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
367d0 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
367e0 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
367f0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
36800 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
36810 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
36820 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
36830 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
36840 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
36850 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
36860 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
36870 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
36880 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
36890 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
368a0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
368b0 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
368c0 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
368d0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
368e0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
368f0 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
36900 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
36910 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
36920 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
36930 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
36940 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
36950 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
36960 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
36970 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
36980 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
36990 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
369a0 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
369b0 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  4-8"..      **. 
369c0 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
369d0 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35  -OF: R-19920-115
369e0 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65  76 However, newe
369f0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
36a00 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20  Lite still.     
36a10 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20   ** avoid using 
36a20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74  the last six ent
36a30 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65  ries in the free
36a40 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
36a50 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a  array in.      *
36a60 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74  * order that dat
36a70 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
36a80 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72  ted by newer ver
36a90 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
36aa0 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  can be.      ** 
36ab0 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65  read by older ve
36ac0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
36ad0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36af0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
36b00 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
36b10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36b20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
36b30 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
36b40 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
36b50 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
36b60 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
36b70 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
36b80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
36b90 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
36ba0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
36bb0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
36bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
36bd0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
36be0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
36bf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
36c00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
36c10 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
36c20 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
36c30 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
36c40 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
36c50 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
36c60 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
36c70 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
36c80 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
36c90 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
36ca0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
36cb0 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
36cc0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
36cd0 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
36ce0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
36cf0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
36d00 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
36d10 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
36d20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
36d30 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
36d40 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
36d50 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
36d60 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
36d70 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
36d80 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
36d90 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
36da0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
36db0 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
36dc0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
36dd0 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
36de0 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
36df0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
36e00 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
36e10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
36e20 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
36e30 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
36e40 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
36e50 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
36e60 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
36e70 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
36e80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36e90 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
36ea0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
36eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36ec0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
36ed0 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
36ee0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
36ef0 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
36f00 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
36f10 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
36f20 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
36f30 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
36f40 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
36f50 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
36f60 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
36f70 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
36f80 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
36f90 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
36fa0 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
36fb0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
36fc0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
36fd0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
36fe0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
36ff0 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
37000 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
37010 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
37020 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
37030 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
37040 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
37050 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
37060 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
37070 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
37080 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
37090 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
370a0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
370b0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
370c0 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69  given Cell.  Wri
370d0 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20  te the.** local 
370e0 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e  Cell size (the n
370f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
37100 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  n the original p
37110 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a  age, omitting.**
37120 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20   overflow) into 
37130 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  *pnSize..*/.stat
37140 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
37150 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
37160 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
37170 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
37180 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20  ntains the Cell 
37190 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
371a0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a  ar *pCell,    /*
371b0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
371c0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c  he Cell */.  Cel
371d0 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
371e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e        /* Size in
371f0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
37200 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
37210 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
37220 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
37230 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
37240 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
37250 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
37260 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
37270 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
37280 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
37290 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
372a0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
372b0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
372c0 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e  Info);.  if( pIn
372d0 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66  fo->nLocal==pInf
372e0 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  o->nPayload ){. 
372f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37300 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
37310 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
37320 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
37330 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
37340 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 70 49 6e  .  if( pCell+pIn
37350 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20 3e 20 70 50  fo->nSize-1 > pP
37360 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
37370 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
37380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37390 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
373a0 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
373b0 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
373c0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
373d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
373e0 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  ll + pInfo->nSiz
373f0 65 20 2d 20 34 29 3b 0a 20 20 61 73 73 65 72 74  e - 4);.  assert
37400 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
37410 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
37420 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
37430 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
37440 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d   nOvfl = (pInfo-
37450 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66  >nPayload - pInf
37460 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  o->nLocal + ovfl
37470 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
37480 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
37490 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c  sert( nOvfl>0 ||
374a0 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44   .    (CORRUPT_D
374b0 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  B && (pInfo->nPa
374c0 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65  yload + ovflPage
374d0 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69  Size)<ovflPageSi
374e0 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  ze).  );.  while
374f0 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
37500 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
37510 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
37520 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
37530 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
37540 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
37550 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
37560 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
37570 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
37580 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
37590 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
375a0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
375b0 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
375c0 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
375d0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
375e0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
375f0 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
37600 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
37610 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
37620 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
37630 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
37640 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
37650 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
37660 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
37670 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
37680 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
37690 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
376a0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
376b0 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
376c0 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
376d0 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
376e0 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
376f0 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
37700 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
37710 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
37720 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
37730 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
37740 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
37750 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
37760 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
37770 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
37780 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
37790 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
377a0 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
377b0 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
377c0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
377d0 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
377e0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
377f0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
37800 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
37810 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
37820 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
37830 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
37840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
37850 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
37860 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
37870 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
37880 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
37890 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
378a0 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
378b0 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
378c0 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
378d0 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
378e0 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
378f0 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
37900 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
37910 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
37920 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
37930 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
37940 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
37950 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
37960 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
37970 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
37980 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
37990 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
379a0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
379b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
379c0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
379d0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
379e0 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
379f0 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
37a00 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
37a10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
37a20 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
37a30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
37a40 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
37a50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
37a60 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
37a70 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
37a80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
37a90 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
37aa0 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
37ab0 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
37ac0 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
37ad0 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
37ae0 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
37af0 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
37b00 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
37b10 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
37b20 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
37b30 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
37b40 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
37b50 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
37b60 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
37b70 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
37b80 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
37b90 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
37ba0 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
37bb0 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
37bc0 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
37bd0 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
37be0 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
37bf0 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
37c00 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
37c10 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
37c20 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
37c30 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
37c40 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
37c50 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
37c60 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
37c70 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
37c80 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
37c90 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
37ca0 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
37cb0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
37cc0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
37cd0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
37ce0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
37cf0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
37d00 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
37d10 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
37d20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
37d30 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64  nst BtreePayload
37d40 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20   *pX,        /* 
37d50 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69  Payload with whi
37d60 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  ch to construct 
37d70 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
37d80 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
37d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37da0 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
37db0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
37dc0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
37dd0 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
37de0 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
37df0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
37e00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
37e10 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
37e20 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
37e30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
37e40 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
37e50 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
37e60 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
37e70 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
37e80 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
37e90 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
37ea0 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  Header;..  asser
37eb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
37ec0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
37ed0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
37ee0 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
37ef0 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
37f00 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
37f10 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
37f20 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
37f30 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
37f40 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
37f50 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
37f60 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
37f70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
37f80 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
37f90 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
37fa0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
37fb0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
37fc0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37fd0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
37fe0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
37ff0 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
38000 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67    nHeader = pPag
38010 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
38020 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
38030 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79  tKey ){.    nPay
38040 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61  load = pX->nData
38050 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20   + pX->nZero;.  
38060 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61    pSrc = pX->pDa
38070 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70  ta;.    nSrc = p
38080 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73  X->nData;.    as
38090 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
380a0 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69  KeyLeaf ); /* fi
380b0 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
380c0 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65  called for leave
380d0 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72  s */.    nHeader
380e0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
380f0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
38100 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
38110 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
38120 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
38130 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58  der], *(u64*)&pX
38140 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  ->nKey);.  }else
38150 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58  {.    assert( pX
38160 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66  ->nKey<=0x7fffff
38170 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d  ff && pX->pKey!=
38180 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  0 );.    nSrc = 
38190 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29  nPayload = (int)
381a0 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53  pX->nKey;.    pS
381b0 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20  rc = pX->pKey;. 
381c0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
381d0 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
381e0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
381f0 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  oad);.  }.  .  /
38200 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
38210 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 66 28 20 6e  yload */.  if( n
38220 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
38230 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
38240 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50  n = nHeader + nP
38250 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74  ayload;.    test
38260 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20  case( n==3 );.  
38270 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34    testcase( n==4
38280 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20   );.    if( n<4 
38290 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e  ) n = 4;.    *pn
382a0 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70  Size = n;.    sp
382b0 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f  aceLeft = nPaylo
382c0 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  ad;.    pPrior =
382d0 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b   pCell;.  }else{
382e0 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50  .    int mn = pP
382f0 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
38300 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61     n = mn + (nPa
38310 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
38320 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
38330 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
38340 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
38350 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
38360 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
38370 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
38380 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  +1 );.    if( n 
38390 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
383a0 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20  l ) n = mn;.    
383b0 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
383c0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b     *pnSize = n +
383d0 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
383e0 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
383f0 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20  l[nHeader+n];.  
38400 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  }.  pPayload = &
38410 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
38420 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
38430 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
38440 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
38450 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
38460 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
38470 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
38480 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
38490 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
384a0 61 64 20 20 20 20 20 2