/ Hex Artifact Content
Login

Artifact 616212acc17a89d835fb5a9d379881af42485790:


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 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55d0: 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69  load(pCur, 0, (i
55e0: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  nt)pCur->nKey, p
55f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
5600: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5610: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
5620: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
5630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
5650: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5670: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
5680: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
5690: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
56a0: 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70  >curIntKey || !p
56b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72  Cur->pKey );.  r
56c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
56d0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
56e0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
56f0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
5700: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
5710: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
5720: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
5730: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
5740: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
5750: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
5760: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5770: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
5780: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
5790: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
57a0: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
57b0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
57c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
57d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
57e0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
57f0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5800: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
5810: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5820: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5830: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50  e || CURSOR_SKIP
5840: 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61  NEXT==pCur->eSta
5850: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5860: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  ) );..  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
58b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
58c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
58d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
58e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
58f0: 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
5900: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43   }..  rc = saveC
5910: 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a  ursorKey(pCur);.
5920: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5930: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5940: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5950: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5960: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5970: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5980: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  EK;.  }..  pCur-
5990: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
59a0: 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
59b0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
59c0: 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74  F_AtLast);.  ret
59d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
59e0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5a00: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5a10: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5a20: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5a30: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5a40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5a50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5a60: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5a70: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5a80: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5a90: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5aa0: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
5ab0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
5ac0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
5ad0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
5ae0: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
5af0: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
5b00: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5b10: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5b20: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5b30: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5b40: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5b50: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5b60: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5b70: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5b80: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5b90: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5ba0: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
5bb0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
5bc0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
5bd0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
5be0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
5bf0: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
5c00: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5c10: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5c20: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5c30: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5c40: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5c50: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5c60: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5c70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5c80: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5c90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5ca0: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5cb0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5cc0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5cd0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5ce0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5cf0: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5d00: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5d10: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5d20: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5d30: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5d40: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5d50: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5d60: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5d70: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5d80: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5d90: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5da0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5db0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5dc0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5dd0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5de0: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5df0: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5e00: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5e10: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5e20: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5e30: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5e40: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5e50: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5e60: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5e70: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5e90: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5ea0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5eb0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5ec0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5ed0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5ee0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ef0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5f00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
5f10: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
5f20: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
5f30: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
5f40: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5f50: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5f60: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
5f70: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
5f80: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
5f90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5fa0: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
5fb0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5fc0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
5fd0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
5fe0: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
5ff0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
6000: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
6010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6020: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
6030: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
6040: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
6050: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
6060: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
6070: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
6080: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
6090: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
60a0: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
60b0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
60c0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
60d0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
60e0: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
60f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
6100: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
6110: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
6120: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
6130: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
6140: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
6150: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6160: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6170: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
6180: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
6190: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
61a0: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
61b0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
61c0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
61d0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
61e0: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
61f0: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
6200: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6210: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6220: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6230: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6240: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6250: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6260: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6270: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
6280: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
6290: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
62a0: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
62b0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
62c0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
62d0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
62e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
62f0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
6300: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6340: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6350: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6360: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6370: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
6380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6390: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
63a0: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
63d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
63e0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
63f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
6400: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6410: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6420: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6430: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6440: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6450: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6460: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6470: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6480: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
64a0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
64b0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
64c0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
64d0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
64e0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
64f0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
6500: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6510: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6520: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6530: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6540: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6550: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6560: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6570: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
6580: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
6590: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
65a0: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
65b0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
65c0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
65d0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
65e0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
65f0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
6600: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6610: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6620: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6630: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6640: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6660: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6670: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
6680: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
6690: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
66a0: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
66b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
66e0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
66f0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
6700: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6710: 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66  dex key */..  if
6720: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
6730: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
6740: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
6750: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
6760: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
6770: 63 6b 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d  ckedRecord(pCur-
6780: 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
6790: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
67a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
67b0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73  OMEM_BKPT;.    s
67c0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
67d0: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
67e0: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
67f0: 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  , pKey, pIdxKey)
6800: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
6810: 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a  y->nField==0 ){.
6820: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6830: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6840: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6850: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6860: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6870: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6880: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6890: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
68a0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
68b0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
68c0: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
68d0: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
68e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
68f0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6900: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6910: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6920: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6930: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6940: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
6950: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
6960: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
6970: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
6980: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
6990: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
69a0: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
69b0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
69c0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
69d0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
69e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
69f0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
6a00: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
6a10: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
6a20: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6a30: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
6a40: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
6a50: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
6a60: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
6a70: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
6a80: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
6a90: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
6aa0: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
6ab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
6ac0: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
6ad0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
6ae0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
6af0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6b00: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
6b10: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6b20: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
6b30: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
6b40: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
6b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6b60: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
6b70: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
6b80: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
6b90: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
6ba0: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
6bb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6bd0: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6be0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
6bf0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
6c00: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6c10: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
6c20: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6c30: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
6c40: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
6c50: 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  |= skipNext;.   
6c60: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
6c70: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
6c80: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6c90: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
6ca0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6cb0: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
6cc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6cd0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
6ce0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6cf0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
6d00: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
6d10: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
6d20: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
6d30: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6d40: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
6d50: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
6d60: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
6d70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
6d80: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
6d90: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6da0: 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73   where.** it was
6db0: 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72   last placed, or
6dc0: 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69   has been invali
6dd0: 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74  dated for any ot
6de0: 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43  her reason..** C
6df0: 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20  ursors can move 
6e00: 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65  when the row the
6e10: 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61  y are pointing a
6e20: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6e30: 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  .** from under t
6e40: 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  hem, for example
6e50: 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20  .  Cursor might 
6e60: 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62  also move if a b
6e70: 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c  tree.** is rebal
6e80: 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c  anced..**.** Cal
6e90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
6ea0: 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75  e with a NULL cu
6eb0: 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74  rsor pointer ret
6ec0: 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  urns false..**.*
6ed0: 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61  * Use the separa
6ee0: 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  te sqlite3BtreeC
6ef0: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72  ursorRestore() r
6f00: 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72  outine to restor
6f10: 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61  e a cursor.** ba
6f20: 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f  ck to where it o
6f30: 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68  ught to be if th
6f40: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6f50: 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20  ns true..*/.int 
6f60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6f70: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
6f80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
6f90: 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
6fa0: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e!=CURSOR_VALID;
6fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
6fc0: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
6fd0: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
6fe0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
6ff0: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
7000: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
7010: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
7020: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
7030: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
7040: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
7050: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
7060: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
7070: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
7080: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
7090: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
70a0: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
70b0: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
70c0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
70d0: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
70e0: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
70f0: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
7100: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
7110: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
7120: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
7130: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
7140: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
7150: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
7160: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
7170: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
7180: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
7190: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
71a0: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
71b0: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
71c0: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
71d0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
71e0: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
71f0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7200: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
7210: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
7220: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
7230: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
7240: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
7250: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
7260: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
7270: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
7280: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7290: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
72a0: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
72b0: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
72c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
72d0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
72e0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
72f0: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
7300: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
7310: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7320: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
7330: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
7340: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
7350: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7360: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
7370: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
7380: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
7390: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
73a0: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
73b0: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
73c0: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
73d0: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
73e0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
73f0: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7400: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7410: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
7420: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
7430: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
7440: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
7450: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
7460: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
7470: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7480: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7490: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
74a0: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
74b0: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
74c0: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
74d0: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
74e0: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
74f0: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
7500: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
7510: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7520: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
7530: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7540: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
7550: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
7560: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
7570: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
7580: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
7590: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
75a0: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
75b0: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
75c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
75d0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
75e0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
75f0: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
7600: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
7610: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
7620: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7630: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
7640: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
7650: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
7660: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
7670: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
7680: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
7690: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
76a0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
76b0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
76c0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
76d0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
76e0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
76f0: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7700: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7710: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7720: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7730: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7740: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7750: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7760: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7770: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7780: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
7790: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
77a0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
77b0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
77c0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
77d0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
77e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
77f0: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7800: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7810: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7820: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7830: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7840: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7850: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7860: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7870: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7880: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
7890: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
78a0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
78b0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
78c0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
78d0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
78e0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
78f0: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7900: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7910: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7920: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7930: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7940: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7950: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7960: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7970: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7980: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
7990: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
79a0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
79b0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
79c0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
79d0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
79e0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
79f0: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
7a00: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
7a10: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
7a20: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
7a30: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
7a40: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
7a50: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7a60: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
7a70: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7a80: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
7a90: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
7aa0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7ab0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
7ac0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
7ad0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
7ae0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
7af0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
7b00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7b10: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7b20: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
7b30: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
7b40: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
7b50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b60: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7b70: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
7b80: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
7b90: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
7ba0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
7bb0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7bc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
7bd0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
7be0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
7bf0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
7c00: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
7c10: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
7c20: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
7c30: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7c40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7c50: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7c60: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
7c70: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
7c80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7c90: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
7ca0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
7cb0: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
7cc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7cd0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
7ce0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
7cf0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
7d00: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
7d10: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
7d20: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7d30: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7d40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7d50: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7d60: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7d70: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7d80: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7d90: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7da0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7db0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7dc0: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
7dd0: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
7de0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
7df0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7e00: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
7e10: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
7e20: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7e30: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7e40: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7e50: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7e60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7e70: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7e80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7e90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7ea0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
7eb0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
7ec0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7ed0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
7ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
7ef0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
7f00: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
7f10: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
7f20: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
7f30: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7f40: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7f50: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7f60: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7f70: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7f80: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7f90: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7fa0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7fb0: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
7fc0: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
7fd0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
7fe0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
7ff0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8000: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8010: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8030: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
8040: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
8050: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
8060: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
8070: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8080: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8090: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
80a0: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
80b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
80c0: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
80d0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
80e0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
80f0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8100: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8110: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8120: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
8130: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
8140: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
8150: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8160: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8170: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
8180: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8190: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
81a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
81b0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
81c0: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
81d0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
81e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
81f0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8200: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8210: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8220: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
8230: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
8240: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
8250: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
8260: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
8270: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
8280: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8290: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
82a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
82b0: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
82c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
82d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
82e0: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
82f0: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
8300: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
8310: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
8320: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
8330: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
8340: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
8350: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
8360: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
8370: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
8380: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8390: 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53  BKPT;.  return S
83a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
83b0: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
83c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
83d0: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
83e0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
83f0: 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65  ,x,y,z,rc).  #de
8400: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
8410: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
8420: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
8430: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20  apPutOvflPtr(x, 
8440: 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  y, rc).#endif../
8450: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
8460: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
8470: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
8480: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
8490: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
84a0: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
84b0: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
84c0: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
84d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
84e0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
84f0: 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50  .**.** findCellP
8500: 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68  astPtr() does th
8510: 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74  e same except it
8520: 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20   skips past the 
8530: 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74  initial.** 4-byt
8540: 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  e child pointer 
8550: 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f  found on interio
8560: 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72  r pages, if ther
8570: 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  e is one..**.** 
8580: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
8590: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
85a0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
85b0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
85c0: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
85d0: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
85e0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
85f0: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
8600: 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  & get2byteAligne
8610: 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78  d(&(P)->aCellIdx
8620: 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69  [2*(I)]))).#defi
8630: 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ne findCellPastP
8640: 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  tr(P,I) \.  ((P)
8650: 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28  ->aDataOfst + ((
8660: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8670: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8680: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8690: 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20  (I)]))).../*.** 
86a0: 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  This is common t
86b0: 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ail processing f
86c0: 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  or btreeParseCel
86d0: 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74  lPtr() and.** bt
86e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
86f0: 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63  ndex() for the c
8700: 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c  ase when the cel
8710: 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65  l does not fit e
8720: 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20  ntirely.** on a 
8730: 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61  single B-tree pa
8740: 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73  ge.  Make necess
8750: 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ary adjustments 
8760: 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a  to the CellInfo.
8770: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
8780: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
8790: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72  OINLINE void btr
87a0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
87b0: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
87c0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
87d0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
87e0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
87f0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8800: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8810: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8820: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8830: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8840: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8850: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8860: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8870: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
8880: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
8890: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
88a0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
88b0: 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65   have.  ** to de
88c0: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
88d0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
88e0: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
88f0: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f  pill onto.  ** o
8900: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
8910: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
8920: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
8930: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
8940: 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f  .  ** space on o
8950: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8960: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8970: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8980: 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20  storage.  ** in 
8990: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
89a0: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
89b0: 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67   **.  ** Warning
89c0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
89d0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
89e0: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
89f0: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20  ted in any.  ** 
8a00: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8a10: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
8a20: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
8a30: 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f    */.  int minLo
8a40: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
8a50: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
8a60: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
8a70: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  */.  int maxLoca
8a80: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
8a90: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
8aa0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
8ab0: 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20  .  int surplus; 
8ac0: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8ad0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8ae0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
8af0: 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c  e */..  minLocal
8b00: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8b10: 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  al;.  maxLocal =
8b20: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
8b30: 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69  ;.  surplus = mi
8b40: 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d  nLocal + (pInfo-
8b50: 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  >nPayload - minL
8b60: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
8b70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29  t->usableSize-4)
8b80: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
8b90: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
8ba0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8bb0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8bc0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70  +1 );.  if( surp
8bd0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
8be0: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  ){.    pInfo->nL
8bf0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
8c00: 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lus;.  }else{.  
8c10: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8c20: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8c30: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  .  }.  pInfo->nS
8c40: 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e  ize = (u16)(&pIn
8c50: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8c60: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8c70: 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a  ell) + 4;.}../*.
8c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8c90: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d   routines are im
8ca0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
8cb0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61   the MemPage.xPa
8cc0: 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74  rseCell().** met
8cd0: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65  hod..**.** Parse
8ce0: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
8cf0: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
8d00: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
8d10: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
8d20: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8d30: 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20  r()        =>   
8d40: 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66  table btree leaf
8d50: 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50   nodes.** btreeP
8d60: 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61  arseCellNoPayloa
8d70: 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  d()  =>   table 
8d80: 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e  btree internal n
8d90: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
8da0: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8db0: 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74     =>   index bt
8dc0: 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20  ree nodes.**.** 
8dd0: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
8de0: 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e  wrapper function
8df0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8e00: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
8e10: 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20  .** all MemPage 
8e20: 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72  types and that r
8e30: 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65  eferences the ce
8e40: 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68  ll by index rath
8e50: 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f  er than.** by po
8e60: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
8e70: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8e80: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
8e90: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
8ea0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
8eb0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
8ec0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8ed0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8ee0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8ef0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8f00: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8f10: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8f20: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8f30: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8f40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8f50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8f60: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8f70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8f80: 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  e->leaf==0 );.  
8f90: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
8fa0: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
8fb0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
8fc0: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
8fd0: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
8fe0: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f  ;.#endif.  pInfo
8ff0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65  ->nSize = 4 + ge
9000: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
9010: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
9020: 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d  >nKey);.  pInfo-
9030: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >nPayload = 0;. 
9040: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9050: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61   0;.  pInfo->pPa
9060: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74  yload = 0;.  ret
9070: 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  urn;.}.static vo
9080: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9090: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
90a0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
90b0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
90c0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
90d0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
90e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
90f0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9100: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9110: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9120: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9130: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9140: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9160: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
9170: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
9180: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9190: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
91a0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
91b0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  ll payload */.  
91c0: 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  u64 iKey;       
91d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
91e0: 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a  cted Key value *
91f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9200: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9210: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9220: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9230: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
9240: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
9250: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9260: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
9270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9280: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
9290: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
92a0: 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68   pCell;..  /* Th
92b0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
92c0: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
92d0: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
92e0: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
92f0: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
9300: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a   nPayload);.  **
9310: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
9320: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
9330: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
9340: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c  ll..  */.  nPayl
9350: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
9360: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
9370: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
9380: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
9390: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
93a0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
93b0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
93c0: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
93d0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
93e0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a  ;.    }while( (*
93f0: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
9400: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
9410: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9420: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
9430: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
9440: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
9450: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
9460: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74  += getVarint(pIt
9470: 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  er, (u64*)&pInfo
9480: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20  ->nKey);.  **.  
9490: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
94a0: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
94b0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
94c0: 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a  .  */.  iKey = *
94d0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65  pIter;.  if( iKe
94e0: 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  y>=0x80 ){.    u
94f0: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9500: 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d  [7];.    iKey &=
9510: 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65   0x7f;.    while
9520: 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  (1){.      iKey 
9530: 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a  = (iKey<<7) | (*
9540: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9550: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74  .      if( (*pIt
9560: 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b  er)<0x80 ) break
9570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
9580: 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  r>=pEnd ){.     
9590: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
95a0: 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a  <8) | *++pIter;.
95b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
95c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
95d0: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70  .  pIter++;..  p
95e0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69  Info->nKey = *(i
95f0: 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e  64*)&iKey;.  pIn
9600: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9610: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9620: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9630: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9640: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9650: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9660: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9670: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9680: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9690: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
96a0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
96b0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
96c0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
96d0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
96e0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
96f0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9700: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9710: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9720: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9730: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9740: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9750: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9760: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9770: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9780: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9790: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
97a0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
97b0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
97c0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
97d0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
97e0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
97f0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9800: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9810: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
9820: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9830: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9840: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9850: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9860: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9870: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9880: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9890: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
98a0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
98b0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
98c0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
98d0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
98e0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
98f0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
9900: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9910: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9920: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9930: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9940: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
9950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9960: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9970: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9980: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
9990: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
99a0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
99b0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
99c0: 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  af==0 );.  pIter
99d0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
99e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
99f0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
9a00: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
9a10: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
9a20: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
9a30: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
9a40: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
9a50: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
9a60: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
9a70: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9a80: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
9a90: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
9aa0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9ab0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
9ac0: 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ++;.  pInfo->nKe
9ad0: 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  y = nPayload;.  
9ae0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9af0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9b00: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9b10: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
9b20: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
9b30: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
9b40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
9b50: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
9b60: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
9b70: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
9b80: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
9b90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
9ba0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
9bb0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
9bc0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
9bd0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
9be0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
9bf0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
9c00: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9c10: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9c20: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
9c30: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9c40: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
9c50: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
9c60: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
9c70: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9c80: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
9c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
9ca0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
9cb0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
9cc0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
9cd0: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
9ce0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9cf0: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9d00: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9d10: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9d20: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9d30: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9d50: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9d60: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9d70: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9d80: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9d90: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9da0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
9db0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9dc0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
9dd0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
9de0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9df0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9e00: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9e10: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9e20: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9e30: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9e40: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9e50: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9e60: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9e70: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9e80: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
9e90: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
9ea0: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
9eb0: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
9ec0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
9ed0: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
9ee0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
9ef0: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
9f00: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
9f10: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
9f20: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
9f30: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
9f40: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
9f50: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
9f60: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9f70: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
9f80: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
9f90: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
9fa0: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
9fb0: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
9fc0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
9fd0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
9fe0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
9ff0: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
a000: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a010: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
a020: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a030: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a040: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
a070: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
a080: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a0b0: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
a0c0: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
a0d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a0e0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a0f0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a100: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a110: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a120: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a130: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a140: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a150: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a160: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a170: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a180: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a190: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a1a0: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a1b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a1c0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a1d0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a1e0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a1f0: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a200: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a210: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a220: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a230: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a  ;.#endif..  nSiz
a240: 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  e = *pIter;.  if
a250: 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b  ( nSize>=0x80 ){
a260: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
a270: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65  er[8];.    nSize
a280: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
a290: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
a2a0: 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b  (nSize<<7) | (*+
a2b0: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
a2c0: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
a2d0: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
a2e0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a2f0: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28    pIter++;.  if(
a300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
a310: 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e  {.    /* pIter n
a320: 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  ow points at the
a330: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
a340: 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72  key value, a var
a350: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20  iable length .  
a360: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68    ** integer. Th
a370: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
a380: 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f  k moves pIter to
a390: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69   point at the fi
a3a0: 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  rst byte.    ** 
a3b0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
a3c0: 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a  the key value. *
a3d0: 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  /.    pEnd = &pI
a3e0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ter[9];.    whil
a3f0: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a400: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a410: 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   );.  }.  testca
a420: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a430: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a440: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
a450: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a460: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
a470: 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e<=pPage->maxLoc
a480: 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  al ){.    nSize 
a490: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
a4a0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
a4b0: 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65   nSize<4 ) nSize
a4c0: 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 4;.  }else{. 
a4d0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20     int minLocal 
a4e0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
a4f0: 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  l;.    nSize = m
a500: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65  inLocal + (nSize
a510: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28   - minLocal) % (
a520: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a530: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
a540: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a550: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a560: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
a570: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a580: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a590: 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61     if( nSize>pPa
a5a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
a5b0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69        nSize = mi
a5c0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
a5d0: 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28    nSize += 4 + (
a5e0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a5f0: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ll);.  }.  asser
a600: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
a610: 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52  nfo.nSize || COR
a620: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74  RUPT_DB );.  ret
a630: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
a640: 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  }.static u16 cel
a650: 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
a660: 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  d(MemPage *pPage
a670: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
a680: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
a690: 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f  l + 4; /* For lo
a6a0: 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73  oping over bytes
a6b0: 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   of pCell */.  u
a6c0: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
a6d0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a6e0: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a6f0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a700: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
a710: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
a720: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
a730: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
a740: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
a750: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
a760: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
a770: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
a780: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
a790: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
a7a0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
a7b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
a7c0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
a7d0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
a7e0: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
a7f0: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a800: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a810: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a820: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a830: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a840: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a850: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c  &debuginfo);.#el
a860: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
a870: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
a880: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
a890: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a8a0: 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64  ize==4 );.  pEnd
a8b0: 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20   = pIter + 9;.  
a8c0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
a8d0: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
a8e0: 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74  pEnd );.  assert
a8f0: 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ( debuginfo.nSiz
a900: 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d  e==(u16)(pIter -
a910: 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
a920: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
a930: 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  n (u16)(pIter - 
a940: 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64  pCell);.}...#ifd
a950: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a960: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
a970: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
a980: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
a990: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
a9a0: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
a9b0: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
a9c0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
a9d0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
a9e0: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  ll){.  return pP
a9f0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
aa00: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
aa10: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
aa20: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
aa30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
aa40: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
aa50: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
aa60: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
aa70: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
aa80: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
aa90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
aaa0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
aab0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
aac0: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
aad0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
aae0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
aaf0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
ab00: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
ab10: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
ab20: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
ab30: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
ab40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
ab50: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
ab60: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
ab70: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
ab80: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
ab90: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
aba0: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
abb0: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
abc0: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
abd0: 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20  o.nSize-4]);.   
abe0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
abf0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
ac00: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
ac10: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
ac20: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
ac30: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
ac40: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
ac50: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
ac60: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
ac70: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
ac80: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
ac90: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
aca0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
acb0: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
acc0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
acd0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
ace0: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
acf0: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
ad00: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
ad10: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
ad20: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
ad30: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
ad40: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
ad50: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
ad60: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
ad70: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
ad80: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
ad90: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
ada0: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
adb0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
adc0: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
add0: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
ade0: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
adf0: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
ae00: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
ae10: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
ae20: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
ae30: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
ae40: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
ae50: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
ae60: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ae70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
ae80: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
ae90: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
aea0: 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65  s of the i-th ce
aeb0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
aee0: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
aef0: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
af20: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
af30: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
af40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
af50: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
af60: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
af70: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
af80: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
af90: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
afa0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
afb0: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
afc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
afd0: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
afe0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
aff0: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b010: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
b020: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
b030: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b040: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
b050: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
b060: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b070: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
b080: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
b090: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
b0a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
b0b0: 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  rc;        /* So
b0c0: 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  urce of content 
b0d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
b0e0: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
b0f0: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
b100: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
b110: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74  .  int iCellLast
b120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b130: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
b140: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20  ell index */... 
b150: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b160: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
b170: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b180: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b190: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
b1a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b1b0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b1c0: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
b1d0: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
b1e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
b1f0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
b200: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b210: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b220: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b230: 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63   temp = 0;.  src
b240: 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d   = data = pPage-
b250: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
b260: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b270: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
b280: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
b290: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
b2a0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
b2b0: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
b2c0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b2d0: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
b2e0: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
b2f0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
b300: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
b310: 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  e;.  iCellFirst 
b320: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b330: 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  *nCell;.  iCellL
b340: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
b350: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
b360: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
b370: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
b380: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
b390: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
b3a0: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
b3b0: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
b3c0: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
b3d0: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
b3e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b3f0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b400: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b410: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
b420: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
b430: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
b440: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
b450: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
b460: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
b470: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
b480: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
b490: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
b4a0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
b4b0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
b4c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b4d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b4e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
b4f0: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
b500: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
b510: 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d     size = pPage-
b520: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
b530: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
b540: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
b550: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
b560: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
b570: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
b580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b590: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b5a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
b5b0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
b5c0: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
b5d0: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
b5e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
b5f0: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
b600: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
b610: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
b620: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b630: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
b640: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
b650: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
b660: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
b670: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
b680: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
b690: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
b6a0: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
b6b0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
b6c0: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
b6d0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b6e0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
b6f0: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
b700: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
b710: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
b720: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
b730: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
b740: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
b750: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
b760: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
b770: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
b780: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b790: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
b7a0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
b7b0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
b7c0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
b7d0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
b7e0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
b7f0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
b800: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b810: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
b820: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
b830: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
b840: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
b850: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
b860: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b870: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
b880: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b890: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
b8a0: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
b8b0: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
b8c0: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
b8d0: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
b8e0: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
b8f0: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
b900: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
b910: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
b920: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
b930: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
b940: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
b950: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
b960: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
b970: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
b980: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
b990: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
b9a0: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
b9b0: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
b9c0: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
b9d0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
b9e0: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
b9f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
ba00: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
ba10: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
ba20: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
ba30: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
ba40: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
ba50: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
ba60: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
ba70: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
ba80: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
ba90: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
baa0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
bab0: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
bac0: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
bad0: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
bae0: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
baf0: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
bb00: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
bb10: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
bb20: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
bb30: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
bb40: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
bb50: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
bb60: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
bb70: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
bb80: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
bb90: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
bba0: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
bbb0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
bbc0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
bbd0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  ;..  assert( pc>
bbe0: 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  0 );.  do{.    i
bbf0: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
bc00: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
bc10: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
bc20: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
bc30: 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32  OF: R-06866-3912
bc40: 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  5 Freeblocks are
bc50: 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65   always connecte
bc60: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20  d in order of.  
bc70: 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20    ** increasing 
bc80: 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69  offset. */.    i
bc90: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
bca0: 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34  -4 || pc<iAddr+4
bcb0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
bcc0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
bcd0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
bce0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
bcf0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
bd00: 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54 68  R-22710-53328 Th
bd10: 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72  e third and four
bd20: 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  th bytes of each
bd30: 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  .    ** freebloc
bd40: 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64  k form a big-end
bd50: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
bd60: 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  h is the size of
bd70: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20   the freeblock. 
bd80: 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20     ** in bytes, 
bd90: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d  including the 4-
bda0: 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  byte header. */.
bdb0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
bdc0: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
bdd0: 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20  );.    if( (x = 
bde0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30  size - nByte)>=0
bdf0: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
be00: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
be10: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
be20: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
be30: 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73   < pPg->cellOffs
be40: 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20  et+2*pPg->nCell 
be50: 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  || size+pc > usa
be60: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
be70: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
be80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
be90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
bea0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
beb0: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
bec0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
bed0: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
bee0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
bef0: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
bf00: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
bf10: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
bf20: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
bf30: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
bf40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
bf50: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20  aData[hdr+7]>57 
bf60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
bf70: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
bf80: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
bf90: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
bfa0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
bfb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67  .        ** frag
bfc0: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
bfd0: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
bfe0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
bff0: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26  &aData[iAddr], &
c000: 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  aData[pc], 2);. 
c010: 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72         aData[hdr
c020: 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20  +7] += (u8)x;.  
c030: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c040: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
c050: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
c060: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
c070: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
c080: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
c090: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
c0a0: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
c0b0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
c0c0: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
c0d0: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
c0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c0f0: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
c100: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20   + x];.    }.   
c110: 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20   iAddr = pc;.   
c120: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c130: 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77  aData[pc]);.  }w
c140: 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20 72  hile( pc );..  r
c150: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c160: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
c170: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
c180: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
c190: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
c1a0: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
c1b0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
c1c0: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
c1d0: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
c1e0: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
c1f0: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
c200: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
c210: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
c220: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
c230: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
c240: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
c250: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
c260: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
c270: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
c280: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
c290: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
c2a0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
c2b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
c2c0: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
c2d0: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
c2e0: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
c2f0: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
c300: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
c310: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c320: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
c330: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
c340: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
c350: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
c360: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
c370: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
c380: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
c390: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
c3a0: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
c3b0: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
c3c0: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
c3d0: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
c3e0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
c3f0: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
c400: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
c410: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
c420: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
c430: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
c440: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
c450: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
c460: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
c470: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
c480: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
c490: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
c4a0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
c4b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
c4c0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
c4f0: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
c500: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
c510: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c530: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
c540: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
c550: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
c560: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
c570: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
c580: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
c590: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
c5a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c5b0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c5c0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c5d0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c5e0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
c5f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c600: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
c610: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
c620: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
c630: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
c640: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
c650: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
c660: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
c670: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
c680: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c690: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c6a0: 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70   nByte < (int)(p
c6b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c6c0: 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61  eSize-8) );..  a
c6d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
c6e0: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
c6f0: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
c700: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
c710: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c720: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
c730: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
c740: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a  p<=65536 );.  /*
c750: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c760: 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74  29356-02391 If t
c770: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73  he database uses
c780: 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61   a 65536-byte pa
c790: 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64  ge size.  ** and
c7a0: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70   the reserved sp
c7b0: 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65  ace is zero (the
c7c0: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72   usual value for
c7d0: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29   reserved space)
c7e0: 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  .  ** then the c
c7f0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73  ell content offs
c800: 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70  et of an empty p
c810: 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20  age wants to be 
c820: 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65  65536..  ** Howe
c830: 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65  ver, that intege
c840: 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  r is too large t
c850: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
c860: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
c870: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  .  ** integer, s
c880: 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69  o a value of 0 i
c890: 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c  s used in its pl
c8a0: 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  ace. */.  top = 
c8b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
c8c0: 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74  dr+5]);.  assert
c8d0: 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67  ( top<=(int)pPag
c8e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c8f0: 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74  ze ); /* Prevent
c900: 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61   by getAndInitPa
c910: 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61  ge() */.  if( ga
c920: 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  p>top ){.    if(
c930: 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65   top==0 && pPage
c940: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
c950: 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20  e==65536 ){.    
c960: 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20    top = 65536;. 
c970: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c980: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c990: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c9a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
c9b0: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
c9c0: 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70  pace between gap
c9d0: 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65   and top for one
c9e0: 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74   more cell point
c9f0: 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e  er.  ** array en
ca00: 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20  try offset, and 
ca10: 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  if the freelist 
ca20: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
ca30: 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20  en search the.  
ca40: 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  ** freelist look
ca50: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
ca60: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
ca70: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
ca80: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
ca90: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
caa0: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
cab0: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
cac0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
cad0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
cae0: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
caf0: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
cb00: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
cb10: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
cb20: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
cb30: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
cb40: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
cb50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
cb60: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
cb70: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
cb80: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
cb90: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
cba0: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
cbb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cbc0: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
cbd0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
cbe0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
cbf0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
cc00: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
cc10: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
cc20: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
cc30: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
cc40: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
cc50: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
cc60: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
cc70: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
cc80: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
cc90: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
cca0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ccb0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
ccc0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
ccd0: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
cce0: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
ccf0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
cd00: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
cd10: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
cd20: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
cd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
cd40: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
cd50: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
cd60: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
cd70: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
cd80: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
cd90: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
cda0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
cdb0: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
cdc0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
cdd0: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
cde0: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
cdf0: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
ce00: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
ce10: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
ce20: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
ce30: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
ce40: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
ce50: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
ce60: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
ce70: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
ce80: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
ce90: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
cea0: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
ceb0: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
cec0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
ced0: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
cee0: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
cef0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
cf00: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
cf10: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
cf20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cf30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
cf40: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
cf50: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
cf60: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
cf70: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
cf80: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
cf90: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
cfa0: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
cfb0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
cfc0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
cfd0: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
cfe0: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
cff0: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
d000: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  sced..**.** Note
d010: 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
d020: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
d030: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
d040: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
d050: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
d060: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
d070: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
d080: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
d090: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
d0a0: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
d0b0: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
d0c0: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
d0d0: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
d0e0: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
d0f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d100: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
d110: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
d120: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
d130: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
d140: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
d150: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
d160: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
d170: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
d180: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
d190: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
d1a0: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
d1b0: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
d1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d1e0: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
d1f0: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
d200: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
d210: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d230: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
d240: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
d250: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
d280: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
d290: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
d2a0: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
d2d0: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
d2e0: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
d2f0: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
d300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d310: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
d320: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20   iSize */.  u32 
d330: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
d340: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
d350: 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73  ; /* Largest pos
d360: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
d370: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
d380: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
d390: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
d3a0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
d3b0: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
d3c0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
d3d0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
d3e0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
d3f0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
d400: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
d410: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
d420: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d430: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
d440: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
d450: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
d460: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
d470: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
d480: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
d490: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
d4a0: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
d4b0: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
d4c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d4d0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
d4e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d4f0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d500: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
d510: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
d520: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
d530: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
d540: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
d550: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
d560: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
d570: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
d580: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
d590: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
d5a0: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
d5b0: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
d5c0: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
d5d0: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
d5e0: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
d5f0: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
d600: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
d610: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
d620: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
d630: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
d640: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
d650: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
d660: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
d670: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
d680: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
d690: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
d6a0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d6b0: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
d6c0: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
d6d0: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
d6e0: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
d6f0: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
d700: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
d710: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
d720: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
d730: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
d740: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
d750: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
d760: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69  (&data[iPtr]))<i
d770: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
d780: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
d790: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  +4 ){.        if
d7a0: 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20  ( iFreeBlk==0 ) 
d7b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72  break;.        r
d7c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
d7d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
d7e0: 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20   }.      iPtr = 
d7f0: 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a  iFreeBlk;.    }.
d800: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
d810: 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20  >iLast ) return 
d820: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d830: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
d840: 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c   iFreeBlk>iPtr |
d850: 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b  | iFreeBlk==0 );
d860: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  .  .    /* At th
d870: 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a  is point:.    **
d880: 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20      iFreeBlk:   
d890: 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  First freeblock 
d8a0: 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72  after iStart, or
d8b0: 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20   zero if none.  
d8c0: 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20    **    iPtr:   
d8d0: 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20      The address 
d8e0: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  of a pointer to 
d8f0: 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a  iFreeBlk.    **.
d900: 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
d910: 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20  see if iFreeBlk 
d920: 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73  should be coales
d930: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
d940: 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20   of iStart..    
d950: 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  */.    if( iFree
d960: 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69  Blk && iEnd+3>=i
d970: 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20  FreeBlk ){.     
d980: 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c   nFrag = iFreeBl
d990: 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20  k - iEnd;.      
d9a0: 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c  if( iEnd>iFreeBl
d9b0: 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  k ) return SQLIT
d9c0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
d9d0: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
d9e0: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
d9f0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
da00: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
da10: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
da20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72  ->usableSize ) r
da30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
da40: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
da50: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
da60: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
da70: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
da80: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
da90: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
daa0: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
dab0: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
dac0: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
dad0: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
dae0: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
daf0: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
db00: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
db10: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
db20: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
db30: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
db40: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
db50: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
db60: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
db70: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
db80: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
db90: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
dba0: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
dbb0: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
dbc0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
dbd0: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
dbe0: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
dbf0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
dc00: 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d          nFrag +=
dc10: 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e   iStart - iPtrEn
dc20: 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65  d;.        iSize
dc30: 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a   = iEnd - iPtr;.
dc40: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
dc50: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20   iPtr;.      }. 
dc60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72     }.    if( nFr
dc70: 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29  ag>data[hdr+7] )
dc80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dc90: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
dca0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20   data[hdr+7] -= 
dcb0: 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28  nFrag;.  }.  if(
dcc0: 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74   iStart==get2byt
dcd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
dce0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ){.    /* The ne
dcf0: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61  w freeblock is a
dd00: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
dd10: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
dd20: 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a  ent area,.    **
dd30: 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20   so just extend 
dd40: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
dd50: 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61   area rather tha
dd60: 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72  n create another
dd70: 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  .    ** freelist
dd80: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66   entry */.    if
dd90: 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20  ( iPtr!=hdr+1 ) 
dda0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ddb0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
ddc0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ddd0: 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29  dr+1], iFreeBlk)
dde0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
ddf0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e  data[hdr+5], iEn
de00: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
de10: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
de20: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74  ew freeblock int
de30: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  o the freelist *
de40: 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  /.    put2byte(&
de50: 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61  data[iPtr], iSta
de60: 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  rt);.    put2byt
de70: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
de80: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
de90: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
dea0: 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29  Start+2], iSize)
deb0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
dec0: 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a  Free += iOrigSiz
ded0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
dee0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
def0: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
df00: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
df10: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
df20: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
df30: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
df40: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
df50: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
df60: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
df70: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
df80: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
df90: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
dfa0: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
dfb0: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
dfc0: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
dfd0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
dfe0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
dff0: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
e000: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
e010: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
e020: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
e030: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
e040: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
e050: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
e060: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
e070: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
e080: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
e090: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
e0a0: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
e0b0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
e0c0: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
e0d0: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
e0e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
e0f0: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
e100: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
e110: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
e120: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e130: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
e140: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
e150: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
e160: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
e170: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
e180: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
e190: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
e1a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
e1b0: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
e1c0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61  age->leaf;.  pPa
e1d0: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
e1e0: 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70  cellSizePtr;.  p
e1f0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
e200: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
e210: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
e220: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
e230: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e240: 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32  OF: R-07291-3532
e250: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28  8 A value of 5 (
e260: 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20  0x05) means the 
e270: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
e280: 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65  * interior table
e290: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
e2a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
e2b0: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
e2c0: 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
e2d0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e2e0: 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41   R-26900-09176 A
e2f0: 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78   value of 13 (0x
e300: 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0d) means the pa
e310: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
e320: 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65  eaf table b-tree
e330: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e340: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
e350: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
e360: 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
e370: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e380: 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
e390: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
e3a0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e3b0: 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
e3c0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
e3d0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
e3e0: 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
e3f0: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
e400: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
e410: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
e420: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e430: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
e440: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
e450: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
e460: 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
e470: 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
e480: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
e490: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
e4a0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e4b0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
e4c0: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
e4d0: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
e4e0: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
e4f0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
e500: 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c  3316-37308 A val
e510: 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d  ue of 2 (0x02) m
e520: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e530: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
e540: 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ior index b-tree
e550: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e560: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
e570: 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f  ATA)==2 );.    /
e580: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e590: 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76  -59615-42828 A v
e5a0: 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61  alue of 10 (0x0a
e5b0: 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
e5c0: 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
e5d0: 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  f index b-tree p
e5e0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e5f0: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
e600: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
e610: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e620: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
e630: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e640: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e650: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e660: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
e670: 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  dex;.    pPage->
e680: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
e690: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
e6a0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e6b0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
e6c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
e6d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
e6e0: 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74  608-56469 Any ot
e6f0: 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  her value for th
e700: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
e710: 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20  pe is.    ** an 
e720: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  error. */.    re
e730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e740: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
e750: 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
e760: 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61  ayload = pBt->ma
e770: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20  x1bytePayload;. 
e780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e790: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
e7a0: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
e7b0: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
e7c0: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
e7d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
e7e0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
e7f0: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
e800: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
e810: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
e820: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
e830: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
e840: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
e850: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
e860: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
e870: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
e880: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
e890: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
e8a0: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
e8b0: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
e8c0: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
e8d0: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
e8e0: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
e8f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
e900: 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
e910: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20  age *pPage){..  
e920: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e930: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
e940: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64  t( pPage->pBt->d
e950: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
e960: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e970: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
e980: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
e990: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
e9a0: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
e9b0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
e9c0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
e9d0: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
e9e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
e9f0: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
ea00: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ea10: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
ea20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
ea30: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
ea40: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
ea50: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
ea60: 0a 20 20 20 20 69 6e 74 20 70 63 3b 20 20 20 20  .    int pc;    
ea70: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
ea80: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
ea90: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
eaa0: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
eab0: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
eac0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
ead0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
eae0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
eaf0: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
eb00: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
eb10: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
eb20: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
eb30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
eb40: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
eb50: 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  ure */.    int u
eb60: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
eb70: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
eb80: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
eb90: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
eba0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
ebb0: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
ebc0: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
ebd0: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
ebe0: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72  r */.    int nFr
ebf0: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
ec00: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
ec10: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
ec20: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70  e */.    int top
ec30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
ec40: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
ec50: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ec60: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
ec70: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
ec80: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
ec90: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
eca0: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
ecb0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
ecc0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
ecd0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
ece0: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
ecf0: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
ed00: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
ed10: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
ed20: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
ed30: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
ed40: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
ed50: 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54   R-28594-02890 T
ed60: 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67  he one-byte flag
ed70: 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64   at offset 0 ind
ed80: 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74  icating.    ** t
ed90: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
eda0: 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ype. */.    if( 
edb0: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
edc0: 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20  e, data[hdr]) ) 
edd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ede0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
edf0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
ee00: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
ee10: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
ee20: 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  36 );.    pPage-
ee30: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
ee40: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
ee50: 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  - 1);.    pPage-
ee60: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
ee70: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
ee80: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
ee90: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
eea0: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
eeb0: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  fset = hdr + 8 +
eec0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
eed0: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
eee0: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
eef0: 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
ef00: 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49     pPage->aCellI
ef10: 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dx = &data[cellO
ef20: 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 50 61 67  ffset];.    pPag
ef30: 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
ef40: 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
ef50: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f  dPtrSize];.    /
ef60: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
ef70: 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65  -58015-48175 The
ef80: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
ef90: 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65  r at offset 5 de
efa0: 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20  signates.    ** 
efb0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
efc0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
efd0: 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65  ea. A zero value
efe0: 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65   for this intege
eff0: 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65  r is.    ** inte
f000: 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36  rpreted as 65536
f010: 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67  . */.    top = g
f020: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
f030: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
f040: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f050: 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20  : R-37002-32774 
f060: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
f070: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
f080: 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a   gives the.    *
f090: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * number of cell
f0a0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  s on the page. *
f0b0: 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  /.    pPage->nCe
f0c0: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
f0d0: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
f0e0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
f0f0: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
f100: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61  {.      /* To ma
f110: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
f120: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
f130: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
f140: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72  rrupt */.      r
f150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f160: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
f170: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
f180: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f  Page->nCell==MX_
f190: 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 20  CELL(pBt) );.   
f1a0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f1b0: 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49   R-24089-57979 I
f1c0: 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  f a page contain
f1d0: 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63  s no cells (whic
f1e0: 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  h is only.    **
f1f0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
f200: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74  root page of a t
f210: 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
f220: 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e  ns no rows) then
f230: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73   the.    ** offs
f240: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
f250: 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c  ontent area will
f260: 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20   equal the page 
f270: 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20  size minus the. 
f280: 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72     ** bytes of r
f290: 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a  eserved space. *
f2a0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
f2b0: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
f2c0: 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  top==usableSize 
f2d0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
f2e0: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
f2f0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
f300: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
f310: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
f320: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
f330: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
f340: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
f350: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
f360: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
f370: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
f380: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
f390: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
f3a0: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
f3b0: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
f3c0: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
f3d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
f3e0: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
f3f0: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
f400: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
f410: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
f420: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
f430: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
f440: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
f450: 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 42   - 4;.    if( pB
f460: 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
f470: 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b  QLITE_CellSizeCk
f480: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
f490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f4a0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
f4b0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
f4c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
f4d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
f4e0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
f4f0: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
f500: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
f510: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
f520: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
f530: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
f540: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
f550: 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
f560: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
f570: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f580: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
f590: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
f5a0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
f5b0: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
f5c0: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
f5d0: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
f5e0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
f5f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f600: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f610: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
f620: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
f630: 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61  ize(pPage, &data
f640: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
f650: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
f660: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
f670: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
f680: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
f690: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f6a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f6b0: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
f6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f6d0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
f6e0: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
f6f0: 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  }  ..    /* Comp
f700: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
f710: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
f720: 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49 44  page.    ** EVID
f730: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38  ENCE-OF: R-23588
f740: 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62  -34450 The two-b
f750: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
f760: 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68  ffset 1 gives th
f770: 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f  e.    ** start o
f780: 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
f790: 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
f7a0: 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
f7b0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
f7c0: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
f7d0: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
f7e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f7f0: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
f800: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
f810: 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72  op;  /* Init nFr
f820: 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c  ee to non-freebl
f830: 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a  ock free space *
f840: 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 30 20 29  /.    if( pc>0 )
f850: 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 65 78 74  {.      u32 next
f860: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
f870: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f880: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
f890: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
f8a0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
f8b0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
f8c0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
f8d0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
f8e0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
f8f0: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
f900: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
f910: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ock..        */.
f920: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f930: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f940: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
f950: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
f960: 20 20 20 20 20 20 20 69 66 28 20 70 63 3e 69 43         if( pc>iC
f970: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f980: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f990: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f9a0: 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66   /* Freeblock of
f9b0: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
f9c0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
f9d0: 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20   }.        next 
f9e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f9f0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  [pc]);.        s
fa00: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
fa10: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
fa20: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
fa30: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
fa40: 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b     if( next<=pc+
fa50: 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a  size+3 ) break;.
fa60: 20 20 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78          pc = nex
fa70: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
fa80: 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20   if( next>0 ){. 
fa90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
faa0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
fab0: 54 3b 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b  T;  /* Freeblock
fac0: 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e   not in ascendin
fad0: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
fae0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b   }.      if( pc+
faf0: 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69  size>(unsigned i
fb00: 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  nt)usableSize ){
fb10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fb20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
fb30: 4b 50 54 3b 20 20 2f 2a 20 4c 61 73 74 20 66 72  KPT;  /* Last fr
fb40: 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20  eeblock extends 
fb50: 70 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f  past page end */
fb60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
fb70: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
fb80: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
fb90: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
fba0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
fbb0: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
fbc0: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
fbd0: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
fbe0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
fbf0: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
fc00: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
fc10: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
fc20: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
fc30: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
fc40: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
fc50: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
fc60: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
fc70: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
fc80: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
fc90: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
fca0: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
fcb0: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
fcc0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
fcd0: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
fce0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
fcf0: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
fd00: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
fd10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fd20: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
fd30: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
fd40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
fd50: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
fd60: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
fd70: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
fd80: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
fd90: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
fda0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
fdb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fdc0: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
fdd0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
fde0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
fdf0: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
fe00: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
fe10: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
fe20: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
fe30: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
fe40: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
fe50: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
fe60: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
fe70: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
fe80: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
fe90: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
fea0: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
feb0: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
fec0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
fed0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
fee0: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
fef0: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
ff00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
ff10: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
ff20: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
ff30: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
ff40: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
ff50: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
ff60: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
ff70: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ff80: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
ff90: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
ffa0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ffb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ffc0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
ffd0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
ffe0: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
fff0: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
10000 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
10010 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
10020 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
10030 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
10040 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
10050 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
10060 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
10070 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
10080 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
10090 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
100a0 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
100b0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
100c0 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
100d0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
100e0 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
100f0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
10100 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
10110 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
10120 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
10130 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
10140 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
10150 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
10160 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
10170 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
10180 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
10190 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  t];.  pPage->aDa
101a0 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
101b0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
101c0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ze];.  pPage->nO
101d0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
101e0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
101f0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
10200 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
10210 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
10220 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
10230 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
10240 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
10250 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
10260 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
10270 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
10280 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
10290 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
102a0 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
102b0 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
102c0 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
102d0 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
102e0 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
102f0 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
10300 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
10310 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
10320 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
10330 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
10340 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
10350 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  DbPage);.  if( p
10360 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  gno!=pPage->pgno
10370 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   ){.    pPage->a
10380 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
10390 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
103a0 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ge);.    pPage->
103b0 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
103c0 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42  e;.    pPage->pB
103d0 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61  t = pBt;.    pPa
103e0 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
103f0 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  .    pPage->hdrO
10400 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
10410 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20  ? 100 : 0;.  }. 
10420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10430 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
10440 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
10450 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
10460 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
10470 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
10480 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
10490 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
104a0 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
104b0 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
104c0 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
104d0 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65    See also: btre
104e0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29  eGetUnusedPage()
104f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
10500 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10510 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  NT flag is set, 
10520 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
10530 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20   do not care.** 
10540 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
10550 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
10560 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
10570 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
10580 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
10590 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
105a0 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
105b0 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
105c0 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
105d0 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
105e0 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
105f0 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
10600 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
10610 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
10620 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
10630 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
10640 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
10650 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
10660 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
10670 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
10680 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
10690 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
106a0 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
106b0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
106c0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
106d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
106e0 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
106f0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
10700 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
10710 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
10720 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
10730 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
10740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
10750 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
10760 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
10770 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
10780 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
10790 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
107a0 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
107b0 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
107c0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
107d0 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
107e0 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
107f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10800 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10810 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
10820 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
10830 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
10840 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
10850 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
10860 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
10870 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
10880 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
10890 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
108a0 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
108b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
108c0 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
108d0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
108e0 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
108f0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
10900 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
10910 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
10920 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
10930 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
10940 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
10950 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
10960 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
10970 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
10980 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
10990 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
109a0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
109b0 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
109c0 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
109d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
109e0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
109f0 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
10a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
10a10 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
10a20 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
10a30 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
10a40 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
10a50 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
10a60 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
10a70 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
10a80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10a90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
10aa0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
10ab0 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
10ac0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
10ad0 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
10ae0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
10af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
10b00 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
10b10 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10b20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
10b30 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
10b40 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
10b50 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
10b60 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
10b70 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
10b80 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
10b90 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
10ba0 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
10bb0 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
10bc0 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
10bd0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
10be0 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
10bf0 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
10c00 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43   it..**.** If pC
10c10 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ur!=0 then the p
10c20 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74  age is being fet
10c30 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ched as part of 
10c40 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a  a moveToChild().
10c50 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64  ** call.  Do add
10c60 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63  itional sanity c
10c70 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
10c80 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
10c90 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20  ..** And if the 
10ca0 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69  fetch fails, thi
10cb0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64  s routine must d
10cc0 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69  ecrement pCur->i
10cd0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Page..**.** The 
10ce0 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20  page is fetched 
10cf0 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e  as read-write un
10d00 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74  less pCur is not
10d10 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20   NULL and is.** 
10d20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
10d30 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  or..**.** If an 
10d40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
10d50 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e  en *ppPage is un
10d60 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
10d70 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
10d80 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
10d90 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
10da0 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
10db0 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
10dc0 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
10dd0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
10de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10df0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10e00 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10e30 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
10e40 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
10e50 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
10e60 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
10e70 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
10e80 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72   here */.  BtCur
10e90 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
10ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
10eb0 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20  rsor to receive 
10ec0 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c  the page, or NUL
10ed0 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64  L */.  int bRead
10ee0 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20  Only            
10ef0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
10f00 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70  or a read-only p
10f10 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
10f20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
10f30 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
10f40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10f50 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
10f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
10f70 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d  r==0 || ppPage==
10f80 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  &pCur->apPage[pC
10f90 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
10fa0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
10fb0 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43  || bReadOnly==pC
10fc0 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
10fd0 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
10fe0 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  Cur==0 || pCur->
10ff0 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66  iPage>0 );..  if
11000 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
11010 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
11020 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
11030 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
11040 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
11050 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
11060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11070 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
11080 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
11090 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65  **)&pDbPage, bRe
110a0 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72  adOnly);.  if( r
110b0 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65  c ){.    goto ge
110c0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
110d0 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  or;.  }.  *ppPag
110e0 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
110f0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11100 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ra(pDbPage);.  i
11110 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  f( (*ppPage)->is
11120 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62  Init==0 ){.    b
11130 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
11140 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
11150 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  , pBt);.    rc =
11160 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a   btreeInitPage(*
11170 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  ppPage);.    if(
11180 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11190 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
111a0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
111b0 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
111c0 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
111d0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
111e0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
111f0 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
11200 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
11210 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50  >aData==sqlite3P
11220 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
11230 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  age) );..  /* If
11240 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69   obtaining a chi
11250 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20 63 75  ld page for a cu
11260 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65  rsor, we must ve
11270 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61  rify that the pa
11280 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61  ge is.  ** compa
11290 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 72  tible with the r
112a0 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69  oot page. */.  i
112b0 66 28 20 70 43 75 72 20 26 26 20 28 28 2a 70 70  f( pCur && ((*pp
112c0 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  Page)->nCell<1 |
112d0 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74  | (*ppPage)->int
112e0 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key!=pCur->curIn
112f0 74 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20  tKey) ){.    rc 
11300 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
11310 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61  _BKPT;.    relea
11320 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
11330 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
11340 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
11350 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11360 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49  ITE_OK;..getAndI
11370 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20  nitPage_error:. 
11380 20 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72   if( pCur ) pCur
11390 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73  ->iPage--;.  tes
113a0 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29  tcase( pgno==0 )
113b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
113c0 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
113d0 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72  E_CORRUPT );.  r
113e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
113f0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
11400 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
11410 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
11420 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
11430 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
11440 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
11450 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
11460 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
11470 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
11480 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
11490 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
114a0 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
114b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
114c0 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
114d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
114e0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
114f0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
11500 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
11510 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11520 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
11530 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
11540 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
11550 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11560 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
11570 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
11580 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11590 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
115a0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
115b0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
115c0 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
115d0 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
115e0 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
115f0 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
11600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
11610 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a  n unused page..*
11620 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
11630 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47  just like btreeG
11640 65 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68  etPage() with th
11650 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a  e addition:.**.*
11660 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61  *   *  If the pa
11670 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
11680 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74   use for some ot
11690 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d  her purpose, imm
116a0 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  ediately.**     
116b0 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20   release it and 
116c0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
116d0 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a  _CURRUPT error..
116e0 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72  **   *  Make sur
116f0 65 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61  e the isInit fla
11700 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74  g is clear.*/.st
11710 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
11720 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42  tUnusedPage(.  B
11730 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
11740 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
11750 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
11760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11770 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
11780 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
11790 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
117a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
117b0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
117c0 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
117d0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
117e0 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
117f0 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
11800 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
11810 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
11820 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
11830 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
11840 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
11850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11860 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
11870 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
11880 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
11890 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
118a0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
118b0 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
118c0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
118d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
118e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
118f0 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
11900 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65  isInit = 0;.  }e
11910 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
11920 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
11930 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
11940 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
11950 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
11960 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
11970 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
11980 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
11990 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
119a0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
119b0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
119c0 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
119d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
119e0 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
119f0 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
11a00 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
11a10 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11a20 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
11a30 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
11a40 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
11a50 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
11a60 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
11a70 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
11a80 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
11a90 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
11aa0 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
11ab0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
11ac0 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
11ad0 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
11ae0 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
11af0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11b00 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
11b10 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
11b20 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
11b30 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
11b40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11b50 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11b60 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
11b70 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
11b80 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
11b90 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
11ba0 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
11bb0 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
11bc0 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
11bd0 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
11be0 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
11bf0 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
11c00 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
11c10 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
11c20 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
11c30 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
11c40 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
11c50 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
11c60 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74   will likely ret
11c70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11c80 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74  PT..      ** But
11c90 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65   no harm is done
11ca0 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69   by this.  And i
11cb0 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74  t is very import
11cc0 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ant that.      *
11cd0 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
11ce0 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
11cf0 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
11d00 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
11d10 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
11d20 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
11d30 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
11d40 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
11d50 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
11d60 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
11d70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
11d80 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
11d90 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
11da0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
11db0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
11dc0 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
11dd0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11de0 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
11df0 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
11e00 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
11e10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11e20 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
11e30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
11e40 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
11e50 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
11e60 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
11e70 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
11e80 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
11e90 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
11ea0 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
11eb0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11ec0 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
11ed0 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
11ee0 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
11ef0 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
11f00 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
11f10 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
11f20 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
11f30 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
11f40 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
11f50 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
11f60 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
11f70 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
11f80 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
11f90 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
11fa0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
11fb0 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
11fc0 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
11fd0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
11fe0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
11ff0 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
12000 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
12010 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
12020 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
12030 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
12040 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
12050 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
12060 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
12070 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
12080 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
12090 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42  n bits like.** B
120a0 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
120b0 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d  L and/or BTREE_M
120c0 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EMORY..**.** If 
120d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
120e0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
120f0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
12100 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
12110 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
12120 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
12130 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
12140 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
12150 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
12160 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
12170 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
12180 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
12190 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
121a0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
121b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
121c0 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
121d0 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
121e0 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
121f0 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
12200 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
12210 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
12220 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
12230 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
12240 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
12250 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
12260 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
12270 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
12280 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
12290 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
122a0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
122b0 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
122c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
122d0 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
122e0 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
122f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
12300 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
12310 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
12320 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
12330 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
12340 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
12350 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
12360 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
12370 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
12380 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
12390 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
123a0 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
123b0 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
123c0 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
123d0 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
123e0 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
123f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
12400 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
12410 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
12420 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
12430 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
12440 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
12450 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
12460 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12470 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
12480 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
12490 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
124a0 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
124b0 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
124c0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
124d0 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
124e0 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
124f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
12500 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
12510 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
12520 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
12530 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
12540 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
12550 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
12560 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
12570 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
12580 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
12590 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
125a0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
125b0 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
125c0 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
125d0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
125e0 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
125f0 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
12600 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
12610 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12620 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
12630 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
12640 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
12650 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
12660 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
12670 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
12680 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
12690 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
126a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
126b0 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
126c0 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
126d0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
126e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66            || (vf
126f0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
12700 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
12710 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
12720 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
12730 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b  sert( pVfs!=0 );
12740 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12750 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
12760 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
12770 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66  sert( (flags&0xf
12780 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f  f)==flags );   /
12790 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38  * flags fit in 8
127a0 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   bits */..  /* O
127b0 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47  nly a BTREE_SING
127c0 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  LE database can 
127d0 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  be BTREE_UNORDER
127e0 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ED */.  assert( 
127f0 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55  (flags & BTREE_U
12800 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20  NORDERED)==0 || 
12810 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
12820 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20  INGLE)!=0 );..  
12830 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c  /* A BTREE_SINGL
12840 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  E database is al
12850 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79  ways a temporary
12860 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61   and/or ephemera
12870 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
12880 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
12890 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65  NGLE)==0 || isTe
128a0 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpDb );..  if( i
128b0 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c  sMemdb ){.    fl
128c0 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d  ags |= BTREE_MEM
128d0 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ORY;.  }.  if( (
128e0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
128f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
12900 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c  =0 && (isMemdb |
12910 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20  | isTempDb) ){. 
12920 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76     vfsFlags = (v
12930 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  fsFlags & ~SQLIT
12940 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
12950 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  | SQLITE_OPEN_TE
12960 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d  MP_DB;.  }.  p =
12970 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
12980 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
12990 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
129a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
129b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
129c0 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
129d0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
129e0 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
129f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
12a00 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
12a10 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
12a20 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
12a30 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
12a40 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
12a50 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12a60 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
12a70 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
12a80 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
12a90 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
12aa0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
12ab0 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
12ac0 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
12ad0 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
12ae0 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
12af0 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
12b00 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
12b10 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
12b20 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
12b30 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
12b40 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
12b50 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
12b60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
12b70 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
12b80 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20    int nFilename 
12b90 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12ba0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a  0(zFilename)+1;.
12bb0 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
12bc0 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
12bd0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
12be0 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
12bf0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
12c00 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c  3Malloc(MAX(nFul
12c10 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e  lPathname,nFilen
12c20 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54  ame));.      MUT
12c30 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
12c40 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
12c50 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70  ared; )..      p
12c60 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
12c70 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
12c80 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
12c90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12ca0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
12cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12cc0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
12cd0 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
12ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
12cf0 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
12d00 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69  , zFilename, nFi
12d10 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
12d20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
12d30 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
12d40 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
12d50 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
12d80 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
12d90 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
12da0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12dc0 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
12dd0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
12de0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12df0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12e00 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
12e10 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
12e20 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
12e30 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
12e40 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
12e50 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
12e60 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
12e70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12e80 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
12e90 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
12ea0 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
12eb0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
12ec0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
12ed0 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
12ee0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
12ef0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
12f00 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
12f10 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
12f20 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
12f30 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
12f40 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
12f50 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
12f60 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
12f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
12f80 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
12f90 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
12fa0 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
12fb0 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
12fd0 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
12fe0 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
12ff0 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
13000 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
13010 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
13020 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
13030 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
13040 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
13050 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
13060 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
13070 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
13080 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
13090 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
130a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
130b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
130c0 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
130d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
130e0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
130f0 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
13100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13110 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
13120 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
13130 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13140 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
13150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13160 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
13170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13180 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
13190 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
131a0 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
131b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
131c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
131d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
131e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
131f0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
13200 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13210 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
13220 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
13230 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
13240 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
13250 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
13260 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
13270 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
13280 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
13290 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
132a0 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
132b0 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
132c0 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
132d0 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
132e0 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
132f0 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
13300 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13310 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
13320 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
13330 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
13340 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13350 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
13360 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
13370 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
13380 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
13390 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
133a0 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
133b0 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
133c0 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
133d0 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
133e0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
133f0 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
13400 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
13410 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
13420 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
13430 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
13440 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
13450 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
13460 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
13470 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(i64)==8 );. 
13480 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13490 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(u64)==8 );.   
134a0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
134b0 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
134c0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
134d0 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
134e0 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
134f0 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
13500 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
13510 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
13520 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
13530 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
13540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13550 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
13560 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
13570 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
13580 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
13590 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
135a0 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
135b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
135c0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
135d0 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61  of(MemPage), fla
135e0 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
135f0 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
13600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13610 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13620 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
13630 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
13640 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
13650 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13660 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
13670 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
13680 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
13690 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
136a0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
136b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
136c0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
136d0 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
136e0 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
136f0 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
13700 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
13710 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
13720 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
13730 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
13740 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
13750 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
13760 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
13770 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
13780 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
13790 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
137a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
137b0 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
137c0 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
137d0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
137e0 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51  _ONLY;.#ifdef SQ
137f0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
13800 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  TE.    pBt->btsF
13810 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
13820 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69  RE_DELETE;.#endi
13830 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  f.    /* EVIDENC
13840 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
13850 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
13860 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
13870 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
13880 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
13890 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
138a0 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
138b0 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
138c0 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
138d0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
138e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
138f0 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61  . */.    pBt->pa
13900 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61  geSize = (zDbHea
13910 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a  der[16]<<8) | (z
13920 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36  DbHeader[17]<<16
13930 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
13940 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
13950 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
13960 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
13970 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
13980 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
13990 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
139a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
139b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
139c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
139d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
139e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d       /* If the m
139f0 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
13a00 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65  ry:" will create
13a10 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
13a20 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20  tabase, then.   
13a30 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
13a40 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
13a50 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
13a60 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
13a70 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
13a80 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
13a90 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f  ACUUM is true. O
13aa0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
13ab0 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  , if.      ** SQ
13ac0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
13ad0 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69  DB has been defi
13ae0 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f  ned, then ":memo
13af0 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20  ry:" is just a. 
13b00 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20       ** regular 
13b10 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68  file-name. In th
13b20 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f  is case the auto
13b30 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20  -vacuum applies 
13b40 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20  as per normal.. 
13b50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13b60 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  ( zFilename && !
13b70 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
13b80 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
13b90 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
13ba0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
13bb0 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
13bc0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
13bd0 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
13be0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d  ULT_AUTOVACUUM==
13bf0 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  2 ? 1 : 0);.    
13c00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
13c10 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20   nReserve = 0;. 
13c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c30 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
13c40 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68  R-37497-42412 Th
13c50 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
13c60 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73  served region is
13c70 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  .      ** determ
13c80 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
13c90 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
13ca0 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
13cb0 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
13cc0 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65       ** into the
13cd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
13ce0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eader. */.      
13cf0 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
13d00 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20  ader[20];.      
13d10 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
13d20 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
13d30 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
13d40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
13d50 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
13d60 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
13d70 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
13d80 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
13d90 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
13da0 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
13db0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
13dc0 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
13dd0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
13de0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13df0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
13e00 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
13e10 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
13e20 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rve);.    if( rc
13e30 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
13e40 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
13e50 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
13e60 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
13e70 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
13e80 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
13e90 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
13ea0 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
13eb0 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
13ec0 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
13ed0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
13ee0 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
13ef0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13f00 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
13f10 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
13f20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
13f30 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
13f40 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
13f50 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
13f60 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
13f70 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
13f80 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
13f90 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
13fa0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
13fb0 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d  hared; ).      M
13fc0 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
13fd0 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
13fe0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
13ff0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14000 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
14010 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
14020 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
14030 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
14040 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
14050 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
14060 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
14070 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
14080 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
14090 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
140a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
140b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
140c0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
140d0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
140e0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
140f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14100 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14110 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14120 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
14130 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14140 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14150 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
14160 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14170 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14180 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
14190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
141a0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
141b0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
141c0 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
141d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
141e0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
141f0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14200 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14210 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
14220 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
14230 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
14240 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
14250 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
14260 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
14270 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
14280 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
14290 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
142a0 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
142b0 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
142c0 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
142d0 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
142e0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
142f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14300 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
14310 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14320 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
14330 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
14340 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
14350 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
14360 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
14370 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
14380 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
14390 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
143a0 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42   if( (uptr)p->pB
143b0 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42  t<(uptr)pSib->pB
143c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
143d0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
143e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
143f0 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
14400 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
14410 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
14420 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
14430 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
14440 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e  & (uptr)pSib->pN
14450 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  ext->pBt<(uptr)p
14460 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
14470 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
14480 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
14490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
144a0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
144b0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
144c0 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
144d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
144e0 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
144f0 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14500 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14520 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
14530 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
14540 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14550 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
14560 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
14570 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
14580 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
14590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
145a0 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
145b0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
145c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
145d0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
145e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
145f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
14600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14610 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
14620 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
14630 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
14640 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20  le *pFile;..    
14650 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65  /* If the B-Tree
14660 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
14670 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68  y opened, set th
14680 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
14690 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ze to the.    **
146a0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
146b0 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65  Except, when ope
146c0 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74  ning on an exist
146d0 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72  ing shared pager
146e0 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64  -cache,.    ** d
146f0 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
14700 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
14710 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
14720 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ( sqlite3BtreeSc
14730 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30  hema(p, 0, 0)==0
14740 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14750 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
14760 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  ze(p->pBt->pPage
14770 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  r, SQLITE_DEFAUL
14780 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20  T_CACHE_SIZE);. 
14790 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20     }..    pFile 
147a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
147b0 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  le(pBt->pPager);
147c0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
147d0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
147e0 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
147f0 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65  ontrolHint(pFile
14800 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
14810 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d  DB, (void*)&pBt-
14820 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >db);.    }.  }.
14830 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
14840 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
14850 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14860 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
14870 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14880 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
14890 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  n);.  }.  assert
148a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
148b0 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  || sqlite3BtreeC
148c0 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a  onnectionCount(*
148d0 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20  ppBtree)>0 );.  
148e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
148f0 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
14900 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
14910 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
14920 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
14930 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
14940 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
14950 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
14960 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
14970 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
14980 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
14990 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
149a0 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
149b0 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
149c0 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
149d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
149e0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
149f0 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
14a00 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
14a10 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
14a20 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  CHE.  MUTEX_LOGI
14a30 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
14a40 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42   *pMaster; ).  B
14a50 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
14a60 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
14a70 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
14a80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
14a90 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
14aa0 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  );.  MUTEX_LOGIC
14ab0 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
14ac0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14ad0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14ae0 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
14af0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14b00 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
14b10 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
14b20 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
14b30 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
14b40 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
14b50 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
14b60 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
14b70 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14b80 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14b90 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
14ba0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
14bb0 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
14bc0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14bd0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14be0 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
14bf0 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
14c00 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
14c10 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
14c20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
14c30 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
14c40 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
14c50 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
14c60 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
14c70 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
14c80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14c90 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
14ca0 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
14cb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
14cc0 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
14cd0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
14ce0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
14cf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14d00 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
14d10 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
14d20 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
14d30 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
14d40 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
14d50 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
14d60 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
14d70 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
14d80 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20  SIZE(pBt) bytes 
14d90 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72  with a 4-byte pr
14da0 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d  efix for a left-
14db0 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72  child.** pointer
14dc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14dd0 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
14de0 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
14df0 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
14e00 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
14e10 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
14e20 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
14e30 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
14e40 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65  e );..    /* One
14e50 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20   of the uses of 
14e60 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69  pBt->pTmpSpace i
14e70 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c  s to format cell
14e80 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  s before.    ** 
14e90 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69  inserting them i
14ea0 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20  nto a leaf page 
14eb0 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e  (function fillIn
14ec0 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20  Cell()). If.    
14ed0 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73  ** a cell is les
14ee0 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69  s than 4 bytes i
14ef0 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f  n size, it is ro
14f00 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79  unded up to 4 by
14f10 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  tes.    ** by th
14f20 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e  e various routin
14f30 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61  es that manipula
14f40 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e  te binary cells.
14f50 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61   Which.    ** ca
14f60 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c  n mean that fill
14f70 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e  InCell() only in
14f80 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69  itializes the fi
14f90 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a  rst 2 or 3.    *
14fa0 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53  * bytes of pTmpS
14fb0 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74  pace, but that t
14fc0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
14fd0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
14fe0 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
14ff0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
15000 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
15010 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c  ually a problem,
15020 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64   but it.    ** d
15030 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67  oes cause a valg
15040 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20  rind error when 
15050 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73  the 1 or 2 bytes
15060 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20   of unitialized 
15070 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
15080 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d  passed to system
15090 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53   call write(). S
150a0 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  o to avoid this 
150b0 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65  error,.    ** ze
150c0 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ro the first 4 b
150d0 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61  ytes of temp spa
150e0 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a  ce here..    **.
150f0 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72      ** Also:  Pr
15100 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73  ovide four bytes
15110 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
15120 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65  space before the
15130 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e  .    ** beginnin
15140 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61  g of pTmpSpace a
15150 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61  s an area availa
15160 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74  ble to prepend t
15170 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63  he.    ** left-c
15180 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  hild pointer to 
15190 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
151a0 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a   a cell..    */.
151b0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
151c0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
151d0 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70  memset(pBt->pTmp
151e0 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20  Space, 0, 8);.  
151f0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15200 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  ce += 4;.    }. 
15210 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
15220 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
15230 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
15240 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
15250 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
15260 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
15270 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
15280 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
15290 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20  pSpace -= 4;.   
152a0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
152b0 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29  (pBt->pTmpSpace)
152c0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  ;.    pBt->pTmpS
152d0 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pace = 0;.  }.}.
152e0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
152f0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
15300 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
15310 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
15320 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
15330 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
15340 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15350 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
15360 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
15370 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
15380 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
15390 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
153a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
153b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
153c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
153d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
153e0 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
153f0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
15400 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
15410 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
15420 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
15430 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
15440 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
15450 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
15460 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
15470 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
15480 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
15490 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
154a0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
154b0 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
154c0 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
154d0 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
154e0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
154f0 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
15500 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
15510 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
15520 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
15530 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
15540 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  k(p, SQLITE_OK, 
15550 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  0);.  sqlite3Btr
15560 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
15570 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
15580 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
15590 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
155a0 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
155b0 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
155c0 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
155d0 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
155e0 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
155f0 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
15600 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
15610 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
15620 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
15630 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
15640 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
15650 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
15660 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
15670 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
15680 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
15690 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
156a0 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
156b0 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
156c0 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
156d0 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
156e0 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
156f0 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
15700 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
15710 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
15720 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
15730 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
15740 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
15750 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
15760 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a  pPager, p->db);.
15770 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
15780 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
15790 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
157a0 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
157b0 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
157c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
157d0 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74  te3DbFree(0, pBt
157e0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
157f0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
15800 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
15810 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
15820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15830 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
15840 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
15850 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
15860 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
15870 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
15880 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
15890 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
158a0 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
158b0 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
158c0 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
158d0 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
158e0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
158f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
15910 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d  e the "soft" lim
15920 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
15930 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
15940 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65   cache..** Unuse
15950 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64  d and unmodified
15960 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72   pages will be r
15970 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65  ecycled when the
15980 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
15990 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
159a0 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f   exceeds this so
159b0 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74  ft limit.  But t
159c0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
159d0 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77  * cache is allow
159e0 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65  ed to grow large
159f0 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69  r than this limi
15a00 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  t if it contains
15a10 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20  .** dirty pages 
15a20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69  or pages still i
15a30 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f  n active use..*/
15a40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15a50 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
15a60 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
15a70 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
15a80 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15a90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15aa0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
15ab0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
15ac0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15ad0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
15ae0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
15af0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
15b00 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
15b10 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
15b40 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69  e the "spill" li
15b50 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
15b60 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
15b70 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74  e cache..** If t
15b80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
15b90 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20  es exceeds this 
15ba0 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77  limit during a w
15bb0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
15bc0 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d  ,.** the pager m
15bd0 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20  ight attempt to 
15be0 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f  "spill" pages to
15bf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72   the journal ear
15c00 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74  ly in.** order t
15c10 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79  o free up memory
15c20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
15c30 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
15c40 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
15c50 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69  size.  If zero i
15c60 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61  s passed.** as a
15c70 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63  n argument, no c
15c80 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
15c90 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a  to the spill siz
15ca0 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a  e setting, so.**
15cb0 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66   using mxPage of
15cc0 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71   0 is a way to q
15cd0 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74  uery the current
15ce0 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a   spill size..*/.
15cf0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15d00 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72  SetSpillSize(Btr
15d10 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
15d20 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
15d30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15d40 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72  int res;.  asser
15d50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15d60 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
15d70 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
15d80 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15d90 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61   res = sqlite3Pa
15da0 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  gerSetSpillsize(
15db0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
15dc0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
15dd0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15de0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23  return res;.}..#
15df0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
15e00 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
15e10 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
15e20 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   on the amount o
15e30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15e40 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a  ile that may be.
15e50 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ** memory mapped
15e60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15e70 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
15e80 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69  t(Btree *p, sqli
15e90 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
15ea0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15eb0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
15ec0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15ed0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
15ee0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
15ef0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15f00 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
15f10 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
15f20 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61  t->pPager, szMma
15f30 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
15f40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15f60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15f70 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
15f80 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  >0 */../*.** Cha
15f90 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
15fa0 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
15fb0 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
15fc0 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
15fd0 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
15fe0 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
15ff0 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
16000 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
16010 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
16020 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
16030 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
16040 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
16050 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
16060 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
16070 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
16080 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
16090 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
160a0 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
160b0 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
160c0 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
160d0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
160e0 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
160f0 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
16100 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
16110 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
16120 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
16130 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
16140 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
16150 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
16160 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
16170 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
16180 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70  lags(.  Btree *p
16190 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
161a0 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73  * The btree to s
161b0 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65  et the safety le
161c0 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  vel on */.  unsi
161d0 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
161e0 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41     /* Various PA
161f0 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  GER_* flags */.)
16200 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16210 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16220 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16230 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16240 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16250 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16260 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16270 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
16280 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a  ager, pgFlags);.
16290 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
162a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
162b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
162c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ndif../*.** Chan
162d0 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
162e0 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
162f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16300 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
16310 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
16320 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
16330 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
16340 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
16350 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
16360 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
16370 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
16380 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
16390 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
163a0 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
163b0 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
163c0 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
163d0 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
163e0 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
163f0 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
16400 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
16410 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
16420 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
16430 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
16440 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
16450 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
16460 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
16470 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
16480 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
16490 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
164a0 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
164b0 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
164c0 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
164d0 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
164e0 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
164f0 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
16500 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
16510 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
16520 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
16530 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
16540 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16550 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
16560 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
16570 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
16580 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
16590 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
165a0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
165b0 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
165c0 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
165d0 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
165e0 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
165f0 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
16600 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16610 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
16620 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
16630 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
16640 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
16650 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16660 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
16670 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16680 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
16690 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
166a0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
166b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
166c0 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  (p);.#if SQLITE_
166d0 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
166e0 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70  nReserve>pBt->op
166f0 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70  timalReserve ) p
16700 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
16710 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76  ve = (u8)nReserv
16720 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
16730 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
16740 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
16750 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
16760 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16770 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16780 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
16790 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
167a0 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
167b0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
167c0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
167d0 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
167e0 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
167f0 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
16800 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
16810 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
16820 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
16830 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
16840 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
16850 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
16860 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
16870 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
16880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
16890 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
168a0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
168b0 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
168c0 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
168d0 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
168e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
168f0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
16900 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
16910 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
16920 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
16930 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
16940 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
16950 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
16960 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
16970 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
16980 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
16990 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
169a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
169b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
169c0 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
169d0 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
169e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
169f0 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
16a00 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
16a10 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
16a20 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
16a30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
16a40 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
16a50 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
16a60 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
16a70 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65  t.** may only be
16a80 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73   called if it is
16a90 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
16aa0 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65   the b-tree mute
16ab0 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  x is already.** 
16ac0 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  held..**.** This
16ad0 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e   is useful in on
16ae0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  e special case i
16af0 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  n the backup API
16b00 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69   code where it i
16b10 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20  s.** known that 
16b20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65  the shared b-tre
16b30 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  e mutex is held,
16b40 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f   but the mutex o
16b50 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
16b60 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
16b70 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49  wns *p is not. I
16b80 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73  n this case if s
16b90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16ba0 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65  ().** were to be
16bb0 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68   called, it migh
16bc0 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73  t collide with s
16bd0 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74  ome other operat
16be0 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ion on the.** da
16bf0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
16c00 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73  at owns *p, caus
16c10 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65  ing undefined be
16c20 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
16c30 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
16c40 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72  serveNoMutex(Btr
16c50 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
16c60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16c70 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
16c80 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
16c90 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
16ca0 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
16cb0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72  >usableSize;.  r
16cc0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
16cd0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
16ce0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
16cf0 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
16d00 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
16d10 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
16d20 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
16d30 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
16d40 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
16d50 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
16d60 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
16d70 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  xtensions..**.**
16d80 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d   If SQLITE_HAS_M
16d90 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20  UTEX is defined 
16da0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
16db0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
16dc0 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68  ** greater of th
16dd0 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76  e current reserv
16de0 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65  ed space and the
16df0 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74   maximum request
16e00 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70  ed.** reserve sp
16e10 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
16e20 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d  te3BtreeGetOptim
16e30 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20  alReserve(Btree 
16e40 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
16e50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16e60 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
16e70 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
16e80 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69  veNoMutex(p);.#i
16e90 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16ea0 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d  CODEC.  if( n<p-
16eb0 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
16ec0 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42  erve ) n = p->pB
16ed0 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
16ee0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  e;.#endif.  sqli
16ef0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16f00 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
16f10 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
16f20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
16f30 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
16f40 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
16f50 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
16f60 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
16f70 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
16f80 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
16f90 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
16fa0 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
16fb0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
16fc0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
16fd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16fe0 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
16ff0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
17000 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
17010 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17020 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
17030 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
17040 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
17050 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
17060 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17070 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17080 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
17090 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
170a0 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
170b0 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
170c0 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
170d0 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
170e0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
170f0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
17100 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
17110 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17120 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
17130 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
17140 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17150 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
17160 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
17170 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
17180 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
17190 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
171a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
171b0 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
171c0 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
171d0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
171e0 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
171f0 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
17200 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17210 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
17220 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
17230 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
17240 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
17250 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
17260 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17270 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
17280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
17290 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
172a0 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
172b0 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
172c0 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
172d0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
172e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
172f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
17300 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
17310 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
17320 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
17330 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
17340 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
17350 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
17360 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
17370 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17380 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
17390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
173a0 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
173b0 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
173c0 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
173d0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
173e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
173f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17400 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
17410 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17420 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
17430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
17440 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
17450 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
17460 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
17470 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
17480 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
17490 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
174a0 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
174b0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
174c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
174d0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
174e0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
174f0 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
17500 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
17510 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
17520 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
17530 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17540 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
17550 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
17560 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
17570 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
17580 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
17590 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
175a0 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
175b0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
175c0 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
175d0 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
175e0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
175f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
17600 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
17610 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
17620 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
17630 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
17640 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17650 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
17660 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
17670 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
17680 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
17690 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
176a0 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
176b0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
176c0 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
176d0 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
176e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
176f0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17700 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
17710 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
17720 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
17730 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17740 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
17750 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
17760 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
17770 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
17780 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17790 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
177a0 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
177b0 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
177c0 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
177d0 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
177e0 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
177f0 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
17800 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
17810 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
17820 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
17830 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
17840 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
17850 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
17860 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
17870 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
17880 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
17890 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
178a0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
178b0 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
178c0 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
178d0 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
178e0 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
178f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
17900 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
17910 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17920 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
17930 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
17940 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
17950 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
17960 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
17970 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
17980 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
17990 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
179a0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
179b0 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
179c0 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
179d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
179e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
179f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
17a00 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
17a10 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
17a20 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
17a30 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
17a40 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17a50 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17a60 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
17a70 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
17a80 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
17a90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17aa0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
17ab0 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
17ac0 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
17ad0 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
17ae0 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
17af0 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
17b00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
17b10 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
17b20 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
17b30 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
17b40 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
17b50 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
17b60 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
17b70 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
17b80 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
17b90 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
17ba0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
17bb0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
17bc0 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
17bd0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
17be0 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
17bf0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
17c00 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
17c10 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
17c20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
17c30 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
17c40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17c50 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49  TADB;.    /* EVI
17c60 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33  DENCE-OF: R-4373
17c70 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61  7-39999 Every va
17c80 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
17c90 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a  ase file begins.
17ca0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
17cb0 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74  following 16 byt
17cc0 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20  es (in hex): 53 
17cd0 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32  51 4c 69 74 65 2
17ce0 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20  0 66 6f 72 6d.  
17cf0 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33    ** 61 74 20 33
17d00 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   00. */.    if( 
17d10 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
17d20 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
17d30 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
17d40 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17d50 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
17d60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
17d70 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
17d80 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
17d90 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
17da0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
17db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
17dc0 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
17dd0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17de0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
17df0 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
17e00 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
17e10 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
17e20 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
17e30 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
17e40 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
17e50 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17e60 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17e70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
17e80 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
17e90 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
17ea0 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
17eb0 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
17ec0 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
17ed0 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
17ee0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
17ef0 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
17f00 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
17f10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
17f20 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
17f30 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
17f40 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
17f50 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
17f60 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
17f70 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
17f80 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
17f90 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
17fa0 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
17fb0 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
17fc0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
17fd0 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
17fe0 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
17ff0 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
18000 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
18010 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
18020 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
18030 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18040 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
18050 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18060 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
18070 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
18080 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
18090 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
180a0 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
180b0 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
180c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
180d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
180e0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
180f0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
18100 20 7d 65 6c 73 65 7b 0a 23 69 66 20 53 51 4c 49   }else{.#if SQLI
18110 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
18120 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44  RONOUS!=SQLITE_D
18130 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
18140 52 4f 4e 4f 55 53 0a 20 20 20 20 20 20 20 20 73  RONOUS.        s
18150 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20  qlite3 *db;.    
18160 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20      Db *pDb;.   
18170 20 20 20 20 20 69 66 28 20 28 64 62 3d 70 42 74       if( (db=pBt
18180 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44 62  ->db)!=0 && (pDb
18190 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a  =db->aDb)!=0 ){.
181a0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
181b0 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20   pDb->pBt==0 || 
181c0 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70  pDb->pBt->pBt!=p
181d0 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20  Bt ){ pDb++; }. 
181e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62           if( pDb
181f0 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 0a 20 20  ->bSyncSet==0.  
18200 20 20 20 20 20 20 20 20 20 26 26 20 70 44 62 2d           && pDb-
18210 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 3d 3d 53  >safety_level==S
18220 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
18230 4e 43 48 52 4f 4e 4f 55 53 2b 31 0a 20 20 20 20  NCHRONOUS+1.    
18240 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
18250 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
18260 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f  _level = SQLITE_
18270 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
18280 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 20 20 20  HRONOUS+1;.     
18290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
182a0 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
182b0 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  >pPager,.       
182c0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66          pDb->saf
182d0 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d  ety_level | (db-
182e0 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46  >flags & PAGER_F
182f0 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20  LAGS_MASK));.   
18300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18310 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
18320 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20    if( isOpen==0 
18330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
18340 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
18350 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
18360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18380 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18390 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a  E_NOTADB;.    }.
183a0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
183b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
183c0 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
183d0 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
183e0 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
183f0 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
18400 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
18410 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
18420 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
18430 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
18440 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
18450 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
18460 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
18470 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
18480 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
18490 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
184a0 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
184b0 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
184c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
184d0 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
184e0 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
184f0 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
18500 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
18510 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
18520 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
18530 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
18540 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
18550 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
18560 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
18570 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
18580 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
18590 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
185a0 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
185b0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
185c0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
185d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
185e0 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
185f0 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
18600 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
18610 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
18620 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
18630 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
18640 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
18650 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
18660 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
18670 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
18680 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
18690 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
186a0 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
186b0 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
186c0 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
186d0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
186e0 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
186f0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18700 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
18710 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
18720 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
18730 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18740 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30  OF: R-59310-5120
18750 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20  5 The "reserved 
18760 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74  space" size in t
18770 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a  he 1-byte.    **
18780 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
18790 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d  et 20 is the num
187a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
187b0 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
187c0 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20   of.    ** each 
187d0 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20  page to reserve 
187e0 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  for extensions. 
187f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
18800 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
18810 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
18820 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
18830 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
18840 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
18850 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
18860 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
18870 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
18880 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20  et of 20.    ** 
18890 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
188a0 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
188b0 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  /.    usableSize
188c0 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
188d0 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
188e0 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
188f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
18900 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
18910 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
18920 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
18930 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
18940 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
18950 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
18960 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
18970 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
18980 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
18990 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
189a0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
189b0 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
189c0 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
189d0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
189e0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
189f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
18a00 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
18a10 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
18a20 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
18a30 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
18a40 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
18a50 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
18a60 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
18a70 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
18a80 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
18a90 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
18aa0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
18ab0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
18ac0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
18ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18ae0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
18af0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
18b00 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b30 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
18b40 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
18b50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18b60 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
18b70 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
18b80 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
18b90 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
18ba0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
18bb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18bc0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
18bd0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18be0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
18bf0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18c00 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65  28312-64704 Howe
18c10 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20  ver, the usable 
18c20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  size is not allo
18c30 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  wed to.    ** be
18c40 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20   less than 480. 
18c50 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
18c60 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
18c70 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68   is 512, then th
18c80 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65  e.    ** reserve
18c90 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e  d space size can
18ca0 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a  not exceed 32. *
18cb0 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  /.    if( usable
18cc0 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
18cd0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18ce0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18cf0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
18d00 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
18d10 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
18d20 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
18d30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18d40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
18d50 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
18d60 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
18d70 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
18d80 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
18d90 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
18da0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
18db0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
18dc0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
18dd0 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
18de0 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
18df0 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
18e00 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
18e10 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
18e20 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
18e30 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
18e40 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
18e50 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
18e60 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
18e70 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
18e80 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
18e90 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
18ea0 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
18eb0 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
18ec0 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
18ed0 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
18ee0 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
18ef0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
18f00 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
18f10 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
18f20 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
18f30 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
18f40 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
18f50 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
18f60 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
18f70 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
18f80 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
18f90 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
18fa0 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
18fb0 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
18fc0 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
18fd0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
18fe0 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
18ff0 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
19000 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
19010 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
19020 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
19030 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
19040 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
19050 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
19060 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
19070 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
19080 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
19090 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
190a0 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
190b0 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
190c0 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
190d0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
190e0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
190f0 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74  - 23);.  if( pBt
19100 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29  ->maxLocal>127 )
19110 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
19120 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37  ytePayload = 127
19130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19140 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
19150 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d  oad = (u8)pBt->m
19160 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61  axLocal;.  }.  a
19170 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
19180 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
19190 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
191a0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
191b0 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
191c0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
191d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
191e0 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
191f0 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
19200 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
19210 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
19220 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19230 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
19240 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19250 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
19260 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
19270 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
19280 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
19290 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
192a0 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
192b0 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
192c0 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
192d0 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
192e0 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
192f0 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
19300 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
19310 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
19320 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
19330 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
19340 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
19350 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
19360 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
19370 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
19380 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
19390 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
193a0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
193b0 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
193c0 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
193d0 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
193e0 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
193f0 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
19400 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
19410 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
19420 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
19430 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
19440 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
19450 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
19460 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
19470 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
19480 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
19490 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
194a0 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
194b0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
194c0 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
194d0 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
194e0 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
194f0 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
19500 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
19510 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
19520 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
19530 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
19540 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
19550 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
19560 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
19570 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
19580 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
19590 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
195a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
195b0 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
195c0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
195d0 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
195e0 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
195f0 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
19600 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
19610 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
19620 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
19630 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
19640 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
19650 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
19660 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
19670 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
19680 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
19690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
196a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
196b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
196c0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
196d0 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
196e0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
196f0 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
19700 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
19710 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
19720 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
19730 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
19740 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
19750 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
19760 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
19770 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
19780 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
19790 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
197a0 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
197b0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
197c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
197d0 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a  otNull(pPage1);.
197e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
197f0 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
19800 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
19810 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
19820 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
19830 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
19840 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
19850 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
19860 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
19870 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
19880 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
19890 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
198a0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
198b0 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
198c0 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
198d0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
198e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
198f0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
19900 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
19910 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
19920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
19930 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
19940 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
19950 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
19960 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
19970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19980 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
19990 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
199a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
199b0 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
199c0 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
199d0 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
199e0 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
199f0 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
19a00 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
19a10 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
19a20 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
19a30 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
19a40 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
19a50 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
19a60 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
19a70 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
19a80 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
19a90 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
19aa0 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
19ab0 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
19ac0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
19ad0 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
19ae0 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
19af0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
19b00 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
19b10 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
19b20 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
19b30 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
19b40 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
19b50 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
19b60 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
19b70 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
19b80 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
19b90 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
19ba0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
19bb0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
19bc0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
19bd0 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
19be0 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
19bf0 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
19c00 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
19c10 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
19c20 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
19c30 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
19c40 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
19c50 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
19c60 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
19c70 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
19c80 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
19c90 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
19ca0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
19cb0 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
19cc0 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
19cd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19ce0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
19cf0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
19d00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
19d10 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
19d20 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
19d30 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
19d40 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
19d50 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
19d60 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
19d70 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
19d80 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
19d90 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
19da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19db0 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
19dc0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
19dd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19de0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
19df0 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
19e00 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
19e10 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
19e20 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19e30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19e40 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
19e50 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
19e60 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
19e70 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
19e80 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
19e90 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19ea0 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
19eb0 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
19ec0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
19ed0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
19ee0 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
19ef0 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
19f00 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
19f10 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
19f20 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
19f30 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
19f40 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
19f50 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
19f60 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
19f70 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
19f80 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
19f90 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
19fa0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
19fb0 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
19fc0 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
19fd0 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
19fe0 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
19ff0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
1a000 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
1a010 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1a020 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
1a030 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
1a040 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
1a050 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1a060 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
1a070 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
1a080 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
1a090 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
1a0a0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
1a0b0 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
1a0c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1a0d0 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
1a0e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1a0f0 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
1a100 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a110 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
1a120 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a130 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
1a140 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a150 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
1a160 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
1a170 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
1a180 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
1a190 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
1a1a0 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
1a1b0 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
1a1c0 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
1a1d0 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
1a1e0 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
1a1f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
1a200 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
1a210 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
1a220 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
1a230 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
1a240 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
1a250 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
1a260 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
1a270 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
1a280 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
1a290 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
1a2a0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
1a2b0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
1a2c0 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
1a2d0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
1a2e0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
1a2f0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
1a300 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
1a310 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
1a320 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
1a330 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
1a340 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
1a350 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
1a360 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
1a370 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
1a380 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
1a390 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
1a3a0 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
1a3b0 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
1a3c0 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
1a3d0 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
1a3e0 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
1a3f0 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
1a400 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
1a410 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
1a420 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
1a430 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
1a440 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
1a450 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
1a460 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
1a470 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
1a480 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
1a490 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
1a4a0 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
1a4b0 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
1a4c0 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
1a4d0 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
1a4e0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
1a4f0 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
1a500 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68   wrflag){.  BtSh
1a510 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1a520 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
1a530 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
1a540 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1a550 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1a560 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1a570 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
1a580 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
1a590 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
1a5a0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
1a5b0 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
1a5c0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1a5d0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1a5e0 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
1a5f0 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
1a600 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1a610 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a620 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
1a630 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
1a640 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
1a650 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
1a660 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
1a670 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1a680 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1a690 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
1a6a0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
1a6b0 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
1a6c0 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
1a6d0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
1a6e0 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
1a6f0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
1a700 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
1a710 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1a720 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
1a730 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
1a740 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1a750 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
1a760 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
1a770 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a780 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1a790 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  {.    sqlite3 *p
1a7a0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f  Block = 0;.    /
1a7b0 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
1a7c0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
1a7d0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
1a7e0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
1a7f0 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ion .    ** on t
1a800 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
1a810 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
1a820 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
1a830 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20  ansaction is.   
1a840 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
1a850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1a860 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  KED..    */.    
1a870 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
1a880 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1a890 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
1a8a0 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74       || (pBt->bt
1a8b0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
1a8c0 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a  DING)!=0.    ){.
1a8d0 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
1a8e0 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
1a8f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
1a900 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20  rflag>1 ){.     
1a910 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
1a920 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d        for(pIter=
1a930 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1a940 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
1a950 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
1a960 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1a970 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
1a980 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
1a990 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
1a9a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a9b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a9c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a9d0 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73  Block ){.      s
1a9e0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
1a9f0 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
1aa00 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63  Block);.      rc
1aa10 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
1aa20 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
1aa30 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1aa40 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egun;.    }.  }.
1aa50 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
1aa60 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
1aa70 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
1aa80 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
1aa90 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
1aaa0 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
1aab0 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
1aac0 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
1aad0 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
1aae0 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
1aaf0 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
1ab00 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
1ab10 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
1ab20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
1ab30 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1ab40 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
1ab50 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
1ab60 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1ab70 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1ab80 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c  n;..  pBt->btsFl
1ab90 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54  ags &= ~BTS_INIT
1aba0 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69  IALLY_EMPTY;.  i
1abb0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  f( pBt->nPage==0
1abc0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1abd0 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c   |= BTS_INITIALL
1abe0 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a  Y_EMPTY;.  do {.
1abf0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
1ac00 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
1ac10 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
1ac20 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
1ac30 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
1ac40 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
1ac50 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
1ac60 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
1ac70 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
1ac80 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1ac90 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
1aca0 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
1acb0 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
1acc0 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
1acd0 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
1ace0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1acf0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ad00 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
1ad10 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
1ad20 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
1ad30 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
1ad40 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
1ad50 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
1ad60 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
1ad70 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
1ad80 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
1ad90 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
1ada0 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
1adb0 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
1adc0 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
1add0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ade0 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
1adf0 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d  .      if( (pBt-
1ae00 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1ae10 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  READ_ONLY)!=0 ){
1ae20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ae30 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1ae40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ae50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ae60 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
1ae70 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
1ae80 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
1ae90 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
1aea0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1aeb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1aec0 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
1aed0 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
1aee0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1aef0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
1af00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1af10 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
1af20 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1af30 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
1af40 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
1af50 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
1af60 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1af70 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
1af80 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
1af90 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
1afa0 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
1afb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1afc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1afd0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1afe0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
1aff0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
1b000 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1b010 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1b020 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
1b030 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1b040 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
1b050 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
1b060 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
1b070 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
1b080 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
1b090 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1b0a0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1b0b0 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
1b0c0 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
1b0d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
1b0e0 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
1b0f0 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
1b100 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
1b110 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
1b120 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
1b130 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1b140 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
1b150 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
1b160 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
1b170 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
1b180 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
1b190 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1b1a0 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
1b1b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1b1c0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
1b1d0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
1b1e0 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
1b1f0 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
1b200 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1b210 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
1b220 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
1b230 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
1b240 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1b250 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
1b260 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
1b270 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
1b280 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
1b290 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
1b2a0 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
1b2b0 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
1b2c0 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
1b2d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
1b2e0 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
1b2f0 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
1b300 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
1b310 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
1b320 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1b330 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
1b340 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
1b350 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1b360 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
1b370 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
1b380 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
1b390 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
1b3a0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1b3b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
1b3c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1b3d0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
1b3e0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1b3f0 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
1b400 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b410 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1b420 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1b430 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1b440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b450 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1b460 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1b470 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1b480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b490 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74   }.    }.  }...t
1b4a0 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
1b4b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b4c0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1b4d0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
1b4e0 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
1b4f0 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
1b500 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
1b510 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
1b520 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
1b530 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1b540 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
1b550 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
1b560 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
1b570 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
1b580 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
1b590 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
1b5a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1b5b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1b5c0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1b5d0 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
1b5e0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
1b5f0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1b600 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
1b610 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b620 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1b630 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b640 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
1b650 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
1b660 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
1b670 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
1b680 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
1b690 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
1b6a0 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
1b6b0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1b6c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
1b6d0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
1b6e0 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
1b6f0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
1b700 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
1b710 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
1b720 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
1b730 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
1b740 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b760 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
1b770 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
1b780 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b7a0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
1b7b0 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
1b7c0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1b7f0 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
1b800 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1b810 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
1b820 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
1b830 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1b840 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b850 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1b860 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
1b870 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1b880 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1b890 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1b8a0 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  rc;.  nCell = pP
1b8b0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
1b8c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1b8d0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1b8e0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1b8f0 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
1b900 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
1b910 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1b920 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
1b930 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1b940 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1b950 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
1b960 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
1b970 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1b980 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1b990 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1b9a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1b9b0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1b9c0 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
1b9d0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1b9e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1b9f0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1ba00 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
1ba10 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1ba20 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1ba30 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
1ba40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ba50 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
1ba60 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
1ba70 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
1ba80 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
1ba90 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
1baa0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1bab0 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
1bac0 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
1bad0 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
1bae0 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
1baf0 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
1bb00 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
1bb10 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
1bb20 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1bb30 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1bb40 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
1bb50 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
1bb60 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
1bb70 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1bb80 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
1bb90 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1bba0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1bbb0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
1bbc0 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1bbe0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1bbf0 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
1bc00 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
1bc10 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1bc20 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
1bc30 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
1bc40 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1bc50 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc70 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
1bc80 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
1bc90 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
1bca0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
1bcb0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
1bcc0 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
1bcd0 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
1bce0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1bcf0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1bd00 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1bd10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1bd20 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1bd30 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
1bd40 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
1bd50 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1bd60 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
1bd70 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
1bd80 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
1bd90 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
1bda0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
1bdb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
1bdc0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1bdd0 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
1bde0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bdf0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1be00 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1be10 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1be20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1be30 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
1be40 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  t nCell;.    int
1be50 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62   rc;..    rc = b
1be60 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1be70 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1be80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1be90 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1bea0 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1beb0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1bec0 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
1bed0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1bee0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1bef0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1bf00 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
1bf10 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
1bf20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
1bf30 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
1bf40 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1bf50 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
1bf60 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
1bf70 66 6f 2e 6e 50 61 79 6c 6f 61 64 0a 20 20 20 20  fo.nPayload.    
1bf80 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e       && pCell+in
1bf90 66 6f 2e 6e 53 69 7a 65 2d 31 3c 3d 70 50 61 67  fo.nSize-1<=pPag
1bfa0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
1bfb0 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20  maskPage.       
1bfc0 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34    && iFrom==get4
1bfd0 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1bfe0 6e 53 69 7a 65 2d 34 29 0a 20 20 20 20 20 20 20  nSize-4).       
1bff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1c000 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66  t4byte(pCell+inf
1c010 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b  o.nSize-4, iTo);
1c020 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1c030 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c050 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
1c060 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
1c070 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1c080 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
1c090 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c0a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c0b0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1c0c0 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
1c0d0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
1c0e0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1c0f0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
1c100 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1c110 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1c120 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
1c130 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c140 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1c150 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
1c160 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1c170 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1c180 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
1c190 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  To);.    }.  }. 
1c1a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c1b0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
1c1c0 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
1c1d0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1c1e0 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
1c1f0 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
1c200 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
1c210 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
1c220 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
1c230 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
1c240 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
1c250 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
1c260 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
1c270 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
1c280 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
1c290 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
1c2a0 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
1c2b0 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
1c2c0 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
1c2d0 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
1c2e0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
1c2f0 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
1c300 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
1c310 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
1c320 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
1c330 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1c340 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1c350 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
1c360 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
1c370 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
1c380 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
1c390 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
1c3a0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1c3b0 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
1c3c0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
1c3d0 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
1c3e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
1c3f0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
1c400 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
1c410 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1c420 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
1c430 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
1c440 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
1c450 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
1c460 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
1c470 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
1c480 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
1c490 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
1c4a0 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
1c4b0 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
1c4c0 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
1c4d0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
1c4e0 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
1c4f0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
1c500 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
1c510 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
1c520 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1c530 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
1c540 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
1c550 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1c560 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
1c570 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
1c580 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
1c590 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
1c5a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1c5b0 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
1c5c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c5d0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1c5e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
1c5f0 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
1c600 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
1c610 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
1c620 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
1c630 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
1c640 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
1c650 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
1c660 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
1c670 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
1c680 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
1c690 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
1c6a0 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
1c6b0 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
1c6c0 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
1c6d0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1c6e0 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
1c6f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
1c700 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
1c710 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
1c720 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c730 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1c740 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
1c750 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
1c760 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
1c770 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
1c780 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
1c790 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
1c7a0 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
1c7b0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1c7c0 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
1c7d0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1c7e0 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
1c7f0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
1c800 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
1c810 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
1c820 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
1c830 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
1c840 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
1c850 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
1c860 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
1c870 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1c880 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
1c890 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
1c8a0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
1c8b0 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
1c8c0 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
1c8d0 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
1c8e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
1c8f0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
1c900 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1c910 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1c920 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1c930 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
1c940 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
1c950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1c970 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1c980 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1c990 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
1c9a0 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
1c9b0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
1c9c0 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
1c9d0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1c9e0 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
1c9f0 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
1ca00 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
1ca10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ca20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ca30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ca40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1ca50 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
1ca60 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
1ca70 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
1ca80 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
1ca90 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
1caa0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
1cab0 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
1cac0 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
1cad0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
1cae0 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
1caf0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
1cb00 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1cb10 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
1cb20 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
1cb30 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
1cb40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1cb50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cb60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1cb70 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
1cb80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1cb90 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
1cba0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1cbb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cbc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1cbd0 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
1cbe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1cbf0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
1cc00 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
1cc10 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
1cc20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1cc30 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
1cc40 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1cc50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cc60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
1cc70 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
1cc80 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
1cc90 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
1cca0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ccb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
1ccc0 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
1ccd0 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
1cce0 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
1ccf0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
1cd00 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
1cd10 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
1cd20 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
1cd30 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
1cd40 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
1cd50 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
1cd60 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
1cd70 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
1cd80 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
1cd90 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
1cda0 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
1cdb0 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70  d therefore no p
1cdc0 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c  oint in .** call
1cdd0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1cde0 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
1cdf0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72   SQLITE_DONE. Or
1ce00 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  , if an error .*
1ce10 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  * occurs, return
1ce20 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1ce30 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  r code..**.** Mo
1ce40 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c  re specifically,
1ce50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1ce60 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
1ce70 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62  ganize the datab
1ce80 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20  ase so .** that 
1ce90 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
1cea0 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
1ceb0 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f  tly in use is no
1cec0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
1ced0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
1cee0 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  nFin is the numb
1cef0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
1cf00 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
1cf10 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
1cf20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  were this functi
1cf30 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20  on called until 
1cf40 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1cf50 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  E_DONE..**.** If
1cf60 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72   the bCommit par
1cf70 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
1cf80 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ro, this functio
1cf90 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  n assumes that t
1cfa0 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69  he .** caller wi
1cfb0 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
1cfc0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1cfd0 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
1cfe0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a  s SQLITE_DONE .*
1cff0 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62  * or an error. b
1d000 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64  Commit is passed
1d010 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74   true for an aut
1d020 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d  o-vacuum-on-comm
1d030 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  it .** operation
1d040 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61  , or false for a
1d050 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1d060 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cuum..*/.static 
1d070 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
1d080 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
1d090 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
1d0a0 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62  o iLastPg, int b
1d0b0 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20  Commit){.  Pgno 
1d0c0 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
1d0d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d0e0 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
1d0f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
1d100 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
1d110 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d120 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d130 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1d140 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20  t( iLastPg>nFin 
1d150 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41  );..  if( !PTRMA
1d160 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
1d170 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
1d180 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
1d190 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1d1a0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
1d1b0 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
1d1c0 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
1d1d0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1d1e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1d1f0 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
1d200 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
1d210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1d220 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
1d230 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1d240 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
1d250 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
1d260 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d280 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d290 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1d2a0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1d2b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1d2c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d2d0 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
1d2e0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d2f0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1d300 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1d310 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1d320 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
1d330 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
1d340 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
1d350 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
1d360 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f         ** if bCo
1d370 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mmit is non-zero
1d380 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
1d390 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
1d3a0 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
1d3b0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
1d3c0 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
1d3d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
1d3e0 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
1d3f0 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
1d400 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
1d410 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
1d420 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
1d430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1d440 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
1d450 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1d460 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1d470 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1d480 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1d490 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1d4a0 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f  LastPg, BTALLOC_
1d4b0 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20  EXACT);.        
1d4c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d4d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d4e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d4f0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1d500 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
1d510 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
1d520 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
1d530 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
1d540 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1d550 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
1d560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1d570 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
1d580 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
1d590 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
1d5a0 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20  Page *pLastPg;. 
1d5b0 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20       u8 eMode = 
1d5c0 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f  BTALLOC_ANY;   /
1d5d0 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  * Mode parameter
1d5e0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1d5f0 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20  eePage() */.    
1d600 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30    Pgno iNear = 0
1d610 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e  ;           /* n
1d620 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20  earby parameter 
1d630 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1d640 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20  ePage() */..    
1d650 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1d660 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
1d670 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
1d680 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d690 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d6a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d6b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1d6c0 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65  If bCommit is ze
1d6d0 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
1d6e0 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
1d6f0 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
1d700 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
1d710 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
1d720 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
1d730 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
1d740 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
1d750 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
1d760 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
1d770 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74  bCommit is great
1d780 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
1d790 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
1d7a0 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
1d7b0 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
1d7c0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
1d7d0 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
1d7e0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
1d7f0 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
1d800 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1d810 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1d820 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42         eMode = B
1d830 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20  TALLOC_LE;.     
1d840 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b     iNear = nFin;
1d850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
1d860 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
1d870 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
1d880 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
1d890 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
1d8a0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
1d8b0 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f  eePg, iNear, eMo
1d8c0 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  de);.        if(
1d8d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
1d8f0 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
1d900 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1d910 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1d920 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1d930 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1d940 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f       }while( bCo
1d950 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e  mmit && iFreePg>
1d960 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
1d970 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
1d980 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
1d990 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
1d9a0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
1d9b0 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
1d9c0 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
1d9d0 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  bCommit);.      
1d9e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1d9f0 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
1da00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1da10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1da20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1da30 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f  }.  }..  if( bCo
1da40 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  mmit==0 ){.    d
1da50 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50  o {.      iLastP
1da60 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  g--;.    }while(
1da70 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e   iLastPg==PENDIN
1da80 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1da90 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47   || PTRMAP_ISPAG
1daa0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1dab0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  );.    pBt->bDoT
1dac0 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1dad0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c   pBt->nPage = iL
1dae0 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74  astPg;.  }.  ret
1daf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1db00 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ../*.** The data
1db10 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74  base opened by t
1db20 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1db30 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  t is an auto-vac
1db40 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  uum database.** 
1db50 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73  nOrig pages in s
1db60 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  ize containing n
1db70 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e  Free free pages.
1db80 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65   Return the expe
1db90 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  cted .** size of
1dba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1dbb0 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67   pages following
1dbc0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1dbd0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
1dbe0 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44  atic Pgno finalD
1dbf0 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a  bSize(BtShared *
1dc00 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c  pBt, Pgno nOrig,
1dc10 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20   Pgno nFree){.  
1dc20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20  int nEntry;     
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1dc50 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d  ries on one ptrm
1dc60 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ap page */.  Pgn
1dc70 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20  o nPtrmap;      
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc90 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70  Number of PtrMap
1dca0 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65   pages to be fre
1dcb0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69  ed */.  Pgno nFi
1dcc0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1dcd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1dce0 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45  n value */..  nE
1dcf0 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62  ntry = pBt->usab
1dd00 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72  leSize/5;.  nPtr
1dd10 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
1dd20 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
1dd30 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e  (pBt, nOrig)+nEn
1dd40 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e  try)/nEntry;.  n
1dd50 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
1dd60 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
1dd70 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
1dd80 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1dd90 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
1dda0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1ddb0 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
1ddc0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52    }.  while( PTR
1ddd0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1dde0 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50  nFin) || nFin==P
1ddf0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1de00 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1de10 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  n--;.  }..  retu
1de20 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nFin;.}../*.*
1de30 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
1de40 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
1de50 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
1de60 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1de70 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
1de80 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
1de90 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
1dea0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1deb0 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
1dec0 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
1ded0 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
1dee0 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
1def0 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
1df00 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
1df10 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
1df20 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
1df30 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
1df40 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
1df50 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1df60 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
1df70 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1df80 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
1df90 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
1dfa0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
1dfb0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1dfc0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1dfd0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1dfe0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
1dff0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1e000 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1e010 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
1e020 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1e030 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
1e040 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1e050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1e060 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
1e070 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72  Pgno nOrig = btr
1e080 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1e090 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  ;.    Pgno nFree
1e0a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1e0b0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e0c0 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  36]);.    Pgno n
1e0d0 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
1e0e0 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
1e0f0 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  ree);..    if( n
1e100 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20  Orig<nFin ){.   
1e110 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1e120 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e130 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65   }else if( nFree
1e140 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1e150 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1e160 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1e170 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e180 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
1e190 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1e1a0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1e1b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63          rc = inc
1e1c0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1e1d0 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29   nFin, nOrig, 0)
1e1e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e1f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e200 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1e210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e220 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
1e230 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e240 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1e250 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e260 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1e270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e280 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1e290 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1e2a0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1e2b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1e2c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e2d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e2e0 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
1e2f0 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
1e300 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
1e310 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
1e320 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61   committed for a
1e330 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1e340 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
1e350 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1e360 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
1e370 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
1e380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1e390 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
1e3a0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
1e3b0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
1e3c0 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
1e3d0 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
1e3e0 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
1e3f0 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
1e400 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
1e410 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
1e420 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
1e430 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
1e440 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
1e450 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
1e460 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
1e470 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e480 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e490 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1e4a0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
1e4b0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
1e4c0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1e4d0 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28  r); )..  assert(
1e4e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e4f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1e500 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
1e510 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1e520 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
1e530 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1e540 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
1e550 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
1e560 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
1e570 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1e580 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
1e590 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75   after autovacuu
1e5a0 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ming */.    Pgno
1e5b0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   nFree;        /
1e5c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1e5d0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
1e5e0 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20  t initially */. 
1e5f0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20     Pgno iFree;  
1e600 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
1e610 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65  t page to be fre
1e620 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ed */.    Pgno n
1e630 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20  Orig;        /* 
1e640 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65  Database size be
1e650 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a  fore freeing */.
1e660 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72  .    nOrig = btr
1e670 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1e680 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ;.    if( PTRMAP
1e690 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
1e6a0 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45  ig) || nOrig==PE
1e6b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e6c0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
1e6d0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
1e6e0 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
1e6f0 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69  database for whi
1e700 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67  ch the final pag
1e710 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  e.      ** is ei
1e720 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d  ther a pointer-m
1e730 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70  ap page or the p
1e740 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
1e750 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a  . If one.      *
1e760 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
1e770 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
1e780 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
1e790 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
1e7a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e7b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1e7c0 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
1e7d0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1e7e0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1e7f0 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62    nFin = finalDb
1e800 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1e810 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28   nFree);.    if(
1e820 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65   nFin>nOrig ) re
1e830 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e840 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66  UPT_BKPT;.    if
1e850 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a  ( nFin<nOrig ){.
1e860 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1e870 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1e880 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1e890 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
1e8a0 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
1e8b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
1e8c0 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
1e8d0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
1e8e0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
1e8f0 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ee, 1);.    }.  
1e900 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
1e910 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
1e920 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
1e930 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
1e940 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e950 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
1e960 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e970 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1e980 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1e990 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
1e9a0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e9b0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
1e9c0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1e9d0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1e9e0 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29  aData[28], nFin)
1e9f0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f  ;.      pBt->bDo
1ea00 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1ea10 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1ea20 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20   nFin;.    }.   
1ea30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ea40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1ea50 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1ea60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1ea70 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
1ea80 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref>=sqlite3Page
1ea90 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1eaa0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
1eab0 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
1eac0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ead0 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23  _AUTOVACUUM */.#
1eae0 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64   define setChild
1eaf0 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54  Ptrmaps(x) SQLIT
1eb00 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
1eb10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1eb20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
1eb30 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
1eb40 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
1eb50 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
1eb60 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
1eb70 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
1eb80 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
1eb90 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
1eba0 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
1ebb0 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
1ebc0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
1ebd0 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
1ebe0 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
1ebf0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
1ec00 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
1ec10 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
1ec20 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
1ec30 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
1ec40 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
1ec50 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
1ec60 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
1ec70 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
1ec80 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
1ec90 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
1eca0 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
1ecb0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
1ecc0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
1ecd0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
1ece0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1ecf0 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
1ed00 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
1ed10 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
1ed20 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1ed30 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
1ed40 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
1ed50 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
1ed60 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
1ed70 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
1ed80 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
1ed90 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
1eda0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
1edb0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66  mmitPhaseTwo() f
1edc0 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
1edd0 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
1ede0 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
1edf0 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
1ee00 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
1ee10 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1ee20 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
1ee30 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
1ee40 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
1ee50 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1ee60 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
1ee70 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
1ee80 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
1ee90 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
1eea0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
1eeb0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
1eec0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
1eed0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
1eee0 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
1eef0 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
1ef00 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
1ef10 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
1ef20 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
1ef30 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
1ef40 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
1ef50 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
1ef60 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
1ef70 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
1ef80 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
1ef90 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
1efa0 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
1efb0 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
1efc0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
1efd0 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
1efe0 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
1eff0 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
1f000 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
1f010 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
1f020 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
1f030 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
1f040 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
1f050 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
1f060 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1f070 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
1f080 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
1f090 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
1f0a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f0b0 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
1f0c0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1f0d0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
1f0e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1f0f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1f100 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64  eEnter(p);.#ifnd
1f110 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f120 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1f130 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1f140 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
1f150 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
1f160 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
1f170 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f180 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f190 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1f1a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f1b0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1f1c0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44  .    if( pBt->bD
1f1d0 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  oTruncate ){.   
1f1e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
1f1f0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
1f200 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e  ->pPager, pBt->n
1f210 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
1f220 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
1f230 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1f240 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
1f250 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  ger, zMaster, 0)
1f260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1f270 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1f280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f290 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f2a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
1f2b0 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d  om both BtreeCom
1f2c0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e  mitPhaseTwo() an
1f2d0 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  d BtreeRollback(
1f2e0 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  ).** at the conc
1f2f0 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e  lusion of a tran
1f300 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
1f310 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64  ic void btreeEnd
1f320 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65  Transaction(Btre
1f330 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
1f340 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1f350 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1f360 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
1f370 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1f380 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
1f390 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f3a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f3b0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1f3c0 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
1f3d0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
1f3e0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d  RANS_NONE && db-
1f3f0 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a  >nVdbeRead>1 ){.
1f400 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1f410 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65  are other active
1f420 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
1f430 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20   belong to this 
1f440 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1f450 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64  handle, downgrad
1f460 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e to a read-only
1f470 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
1f480 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  e other statemen
1f490 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74  ts.    ** may st
1f4a0 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66  ill be reading f
1f4b0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1f4c0 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72  .  */.    downgr
1f4d0 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
1f4e0 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
1f4f0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1f500 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
1f510 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
1f520 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61  the handle had a
1f530 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
1f540 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
1f550 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20  rement the .    
1f560 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
1f570 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
1f580 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
1f590 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1f5a0 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68  nt .    ** reach
1f5b0 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68  es 0, set the sh
1f5c0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1f5d0 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
1f5e0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1f5f0 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  d().    ** call 
1f600 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63  below will unloc
1f610 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f  k the pager.  */
1f620 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1f630 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
1f640 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c  ){.      clearAl
1f650 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
1f660 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20  eLocks(p);.     
1f670 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1f680 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  on--;.      if( 
1f690 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
1f6a0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
1f6b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1f6c0 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
1f6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f6e0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63      /* Set the c
1f6f0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
1f700 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
1f710 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
1f720 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  k the .    ** pa
1f730 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
1f740 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
1f750 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
1f760 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
1f770 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1f780 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
1f790 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1f7a0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  used(pBt);.  }..
1f7b0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1f7c0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  (p);.}../*.** Co
1f7d0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1f7e0 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
1f7f0 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
1f800 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1f810 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
1f820 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
1f830 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
1f840 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
1f850 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1f860 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  ne() routine doe
1f870 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
1f880 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  e and should.** 
1f890 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72  be invoked prior
1f8a0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
1f8b0 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
1f8c0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1f8d0 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72  tPhaseOne().** r
1f8e0 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74  outine did all t
1f8f0 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69  he work of writi
1f900 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ng information o
1f910 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66  ut to disk and f
1f920 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lushing the.** c
1f930 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20  ontents so that 
1f940 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e  they are written
1f950 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70   onto the disk p
1f960 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69  latter.  All thi
1f970 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73  s.** routine has
1f980 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65   to do is delete
1f990 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20   or truncate or 
1f9a0 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20  zero the header 
1f9b0 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f  in the.** the ro
1f9c0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28  llback journal (
1f9d0 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65  which causes the
1f9e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
1f9f0 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64  commit) and.** d
1fa00 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  rop locks..**.**
1fa10 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e   Normally, if an
1fa20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1fa30 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61  ile the pager la
1fa40 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e  yer is attemptin
1fa50 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a  g to .** finaliz
1fa60 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1fa70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1fa80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1fa90 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e  urns an error an
1faa0 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c  d.** the upper l
1fab0 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70  ayer will attemp
1fac0 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f  t a rollback. Ho
1fad0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65  wever, if the se
1fae0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
1faf0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65   is non-zero the
1fb00 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72  n this b-tree tr
1fb10 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72  ansaction is par
1fb20 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
1fb30 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  e .** transactio
1fb40 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  n. In this case,
1fb50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1fb60 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1fb70 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20  n committed .** 
1fb80 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d  (by deleting a m
1fb90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1fba0 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  le) and the call
1fbb0 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74  er will ignore t
1fbc0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1fbd0 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53  s return code. S
1fbe0 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72  o, even if an er
1fbf0 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
1fc00 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a  e pager layer,.*
1fc10 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72  * reset the b-tr
1fc20 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72  ee objects inter
1fc30 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64  nal state to ind
1fc40 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77  icate that the w
1fc50 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rite.** transact
1fc60 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  ion has been clo
1fc70 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69  sed. This is qui
1fc80 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20  te safe, as the 
1fc90 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a  pager will have.
1fca0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20  ** transitioned 
1fcb0 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  to the error sta
1fcc0 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  te..**.** This w
1fcd0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
1fce0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
1fcf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1fd00 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
1fd10 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
1fd20 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
1fd30 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
1fd40 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
1fd50 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1fd60 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c  aseTwo(Btree *p,
1fd70 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a   int bCleanup){.
1fd80 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1fd90 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20  s==TRANS_NONE ) 
1fda0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fdb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1fdc0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1fdd0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1fde0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
1fdf0 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
1fe00 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
1fe10 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
1fe20 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
1fe30 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1fe40 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1fe50 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
1fe60 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
1fe70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1fe80 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
1fe90 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72  t rc;.    BtShar
1fea0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1feb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1fec0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1fed0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1fee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
1fef0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
1ff00 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1ff10 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1ff20 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
1ff30 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1ff40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  !=SQLITE_OK && b
1ff50 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20  Cleanup==0 ){.  
1ff60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ff70 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1ff80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ff90 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72  .    p->iDataVer
1ffa0 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70  sion--;  /* Comp
1ffb0 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65  ensate for pPage
1ffc0 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
1ffd0 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69  +; */.    pBt->i
1ffe0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1fff0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
20000 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
20010 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
20020 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
20030 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
20040 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
20050 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20060 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
20070 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
20080 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
20090 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
200a0 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
200b0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
200c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
200d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
200e0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
200f0 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
20100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20110 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20120 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20130 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a  eTwo(p, 0);.  }.
20140 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20150 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
20160 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
20170 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
20180 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
20190 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
201a0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
201b0 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
201c0 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61  very cursor on a
201d0 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74  ny BtShared that
201e0 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
201f0 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68  ences.  Or if th
20200 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
20210 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68   is set to 1, th
20220 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20  en only.** trip 
20230 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e  write cursors an
20240 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72  d leave read cur
20250 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  sors unchanged..
20260 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
20270 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  or is a candidat
20280 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c  e to be tripped,
20290 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
202a0 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e  rs.** that belon
202b0 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  g to other datab
202c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
202d0 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
202e0 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65  e.** sharing the
202f0 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
20300 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
20310 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
20320 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
20330 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68  ck occurs. If th
20340 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66  e writeOnly.** f
20350 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
20360 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72  n only write-cur
20370 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69  sors need be tri
20380 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79  pped - read-only
20390 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65  .** cursors save
203a0 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70   their current p
203b0 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  ositions so that
203c0 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e   they may contin
203d0 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ue .** following
203e0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f   the rollback. O
203f0 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  r, if writeOnly 
20400 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75  is false, all cu
20410 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72  rsors are .** tr
20420 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61  ipped. In genera
20430 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  l, writeOnly is 
20440 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61  false if the tra
20450 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a  nsaction being.*
20460 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f  * rolled back mo
20470 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
20480 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74  ase schema. In t
20490 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20  his case b-tree 
204a0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61  root.** pages ma
204b0 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65  y be moved or de
204c0 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64  leted from the d
204d0 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68  atabase altogeth
204e0 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74  er, making.** it
204f0 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64   unsafe for read
20500 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74   cursors to cont
20510 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  inue..**.** If t
20520 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
20530 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e  g is true and an
20540 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
20550 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20  tered while .** 
20560 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65  saving the curre
20570 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61  nt position of a
20580 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
20590 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20  r, all cursors, 
205a0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  .** including al
205b0 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61  l read-cursors a
205c0 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a  re tripped..**.*
205d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
205e0 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
205f0 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20  ssful, or if an 
20600 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
20610 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63  le.** saving a c
20620 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20  ursor position, 
20630 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
20640 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
20650 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
20660 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
20670 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
20680 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
20690 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
206a0 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
206b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
206c0 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d  rt( (writeOnly==
206d0 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d  0 || writeOnly==
206e0 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65  1) && BTCF_Write
206f0 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
20700 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73   pBtree ){.    s
20710 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20720 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f  (pBtree);.    fo
20730 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
20740 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
20750 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
20760 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28  int i;.      if(
20770 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70   writeOnly && (p
20780 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
20790 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20  F_WriteFlag)==0 
207a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
207b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
207c0 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
207d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
207e0 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
207f0 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
20800 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20  rPosition(p);.  
20810 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
20820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20830 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73           (void)s
20840 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
20850 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65  llCursors(pBtree
20860 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  , rc, 0);.      
20870 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20890 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
208a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
208b0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
208c0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  p);.        p->e
208d0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
208e0 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d  AULT;.        p-
208f0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
20900 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
20910 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
20920 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
20930 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
20940 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
20950 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50  ;.        p->apP
20960 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  age[i] = 0;.    
20970 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
20980 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20990 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
209a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
209b0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
209c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
209d0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  rogress..**.** I
209e0 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
209f0 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e  t SQLITE_OK then
20a00 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
20a10 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72   invalidated (tr
20a20 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20  ipped)..** Only 
20a30 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
20a40 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  e tripped if wri
20a50 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62  teOnly is true b
20a60 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  ut all cursors a
20a70 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66  re.** tripped if
20a80 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
20a90 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  lse.  Any attemp
20aa0 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72  t to use.** a tr
20ab0 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c  ipped cursor wil
20ac0 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  l result in an e
20ad0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
20ae0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
20af0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
20b00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20b10 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
20b20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
20b30 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
20b40 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
20b50 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
20b60 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
20b70 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ck(Btree *p, int
20b80 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77   tripCode, int w
20b90 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  riteOnly){.  int
20ba0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
20bb0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
20bc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
20bd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69  ;..  assert( wri
20be0 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69  teOnly==1 || wri
20bf0 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  teOnly==0 );.  a
20c00 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d  ssert( tripCode=
20c10 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f  =SQLITE_ABORT_RO
20c20 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f  LLBACK || tripCo
20c30 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
20c40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
20c50 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74  nter(p);.  if( t
20c60 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
20c70 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74  OK ){.    rc = t
20c80 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c  ripCode = saveAl
20c90 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
20ca0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
20cb0 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b  ) writeOnly = 0;
20cc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
20cd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20ce0 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
20cf0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
20d00 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  = sqlite3BtreeTr
20d10 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
20d20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f  tripCode, writeO
20d30 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nly);.    assert
20d40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20d50 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  || (writeOnly==0
20d60 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   && rc2==SQLITE_
20d70 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  OK) );.    if( r
20d80 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  c2!=SQLITE_OK ) 
20d90 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20  rc = rc2;.  }.  
20da0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
20db0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
20dc0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
20dd0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
20de0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
20df0 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
20e00 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
20e10 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
20e20 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
20e30 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
20e40 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
20e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20e60 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
20e70 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
20e80 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
20e90 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
20ea0 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
20eb0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
20ec0 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
20ed0 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
20ee0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
20ef0 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
20f00 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
20f10 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
20f20 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
20f30 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
20f40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20f50 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
20f60 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
20f70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
20f80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20f90 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
20fa0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
20fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
20fc0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
20fd0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
20fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
20ff0 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
21000 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
21010 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
21020 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
21030 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
21040 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
21050 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20  lidCursors(pBt, 
21060 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  1)==0 );.    pBt
21070 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
21080 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
21090 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
210a0 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
210b0 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
210c0 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
210d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
210e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
210f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
21100 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
21110 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
21120 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
21130 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  an be rolled.** 
21140 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
21150 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
21160 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20  ransaction. You 
21170 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
21180 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66  nsaction .** bef
21190 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
211a0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
211b0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
211c0 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
211d0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20  atically .** if 
211e0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
211f0 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20  tion commits or 
21200 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
21210 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
21220 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
21230 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
21240 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
21250 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
21260 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
21270 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
21280 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
21290 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
212a0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
212b0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
212c0 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
212d0 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
212e0 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
212f0 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
21300 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
21310 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
21320 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
21330 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75  * A statement su
21340 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  b-transaction is
21350 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
21360 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  an anonymous sav
21370 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76  epoint. The.** v
21380 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
21390 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
213a0 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ter is the total
213b0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
213c0 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64  oints,.** includ
213d0 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e  ing the new anon
213e0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c  ymous savepoint,
213f0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54   open on the B-T
21400 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  ree. i.e. if the
21410 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
21420 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
21430 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74  nd no other stat
21440 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
21450 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61  ns open,.** iSta
21460 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69  tement is 1. Thi
21470 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  s anonymous save
21480 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c  point can be rel
21490 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  eased or rolled 
214a0 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68  back.** using th
214b0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  e sqlite3BtreeSa
214c0 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69  vepoint() functi
214d0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
214e0 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
214f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
21500 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e  Statement){.  in
21510 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
21520 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21530 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21540 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
21550 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
21560 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
21570 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73  ssert( (pBt->bts
21580 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
21590 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61  _ONLY)==0 );.  a
215a0 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
215b0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
215c0 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
215d0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
215e0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
215f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
21600 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
21610 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
21620 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
21630 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
21640 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
21650 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  th.  ** an index
21660 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
21670 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65  l savepoints cre
21680 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
21690 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73  using.  ** SQL s
216a0 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
216b0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
216c0 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
216d0 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73  lback any.  ** s
216e0 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
216f0 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
21700 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
21710 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
21720 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ve..  */.  rc = 
21730 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
21740 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
21750 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
21760 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
21770 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
21780 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21790 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
217a0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
217b0 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
217c0 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
217d0 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
217e0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
217f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
21800 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
21810 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
21820 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
21830 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
21840 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
21850 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
21860 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
21870 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
21880 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
21890 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
218a0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
218b0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
218c0 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
218d0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
218e0 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
218f0 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
21900 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
21910 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
21920 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
21930 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
21940 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
21950 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
21960 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
21970 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
21980 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
21990 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
219a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
219b0 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
219c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
219d0 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
219e0 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
219f0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
21a00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21a10 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
21a20 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
21a30 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
21a40 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21a50 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  t;.    assert( o
21a60 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
21a70 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
21a80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
21a90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
21aa0 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
21ab0 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
21ac0 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
21ad0 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
21ae0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
21af0 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
21b00 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
21b10 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
21b20 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
21b30 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
21b40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21b50 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
21b60 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
21b70 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
21b80 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
21b90 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
21ba0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
21bb0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
21bc0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
21bd0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
21be0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
21bf0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
21c00 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
21c10 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
21c20 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
21c30 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
21c40 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
21c50 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
21c60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
21c70 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
21c80 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
21c90 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
21ca0 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
21cb0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
21cc0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
21cd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21ce0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21cf0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21d00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
21d10 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
21d20 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
21d30 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
21d40 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
21d50 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
21d60 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
21d70 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
21d80 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
21d90 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
21da0 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
21db0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
21dc0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
21dd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
21de0 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
21df0 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
21e00 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
21e10 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
21e20 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
21e30 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
21e40 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
21e50 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
21e60 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69   bit of wrFlag i
21e70 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68  s clear, then th
21e80 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
21e90 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72  y.** be used for
21ea0 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68   reading.  If th
21eb0 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
21ec0 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  t is set, then t
21ed0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
21ee0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
21ef0 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74  ding or for writ
21f00 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
21f10 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
21f20 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ing.** are also 
21f30 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20  met.  These are 
21f40 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
21f50 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
21f60 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20  in order.** for 
21f70 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c  writing to be al
21f80 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
21f90 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
21fa0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
21fb0 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f  d with wrFlag co
21fc0 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57  ntaining BTREE_W
21fd0 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  RCSR.**.** 2:  O
21fe0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
21ff0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
22000 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
22010 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
22020 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
22030 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
22040 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
22050 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
22060 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
22070 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
22080 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
22090 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
220a0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
220b0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
220c0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
220d0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
220e0 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
220f0 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
22100 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
22110 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
22120 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
22130 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
22140 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
22150 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
22160 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
22170 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
22180 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22190 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c  The BTREE_FORDEL
221a0 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61  ETE bit of wrFla
221b0 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79  g may optionally
221c0 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45   be set if BTREE
221d0 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74  _WRCSR.** is set
221e0 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20  .  If FORDELETE 
221f0 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20  is set, that is 
22200 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  a hint to the im
22210 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
22220 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72  t.** this cursor
22230 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73   will only be us
22240 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e  ed to seek to an
22250 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73  d delete entries
22260 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
22270 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72  as part of a lar
22280 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65  ger DELETE state
22290 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45  ment.  The FORDE
222a0 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74  LETE hint is not
222b0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
222c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
222d0 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74    But in a hypot
222e0 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74  hetical alternat
222f0 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69  ive storage engi
22300 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ne .** in which 
22310 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72  index entries ar
22320 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
22330 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72  deleted when cor
22340 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
22350 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c  .** rows are del
22360 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c  eted, the FORDEL
22370 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69  ETE flag is a hi
22380 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b  nt that all SEEK
22390 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f   and DELETE.** o
223a0 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69  perations on thi
223b0 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  s cursor can be 
223c0 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52  no-ops and all R
223d0 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63  EAD operations c
223e0 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  an .** return a 
223f0 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65  null row (2-byte
22400 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a  s: 0x01 0x00)..*
22410 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
22420 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
22430 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
22440 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
22450 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
22460 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
22470 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
22480 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
22490 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
224a0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
224b0 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
224c0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
224d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
224e0 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
224f0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
22500 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
22510 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
22520 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
22530 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
22540 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22550 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
22560 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
22590 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
225a0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
225d0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
225e0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
22610 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
22620 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
22630 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
22640 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
22650 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
22660 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
22670 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
22680 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
226b0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
226c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
226d0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
226e0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
226f0 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
22700 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
22710 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
22720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22730 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65  ooping over othe
22740 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  r all cursors */
22750 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
22760 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
22770 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
22780 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20  t( wrFlag==0 .  
22790 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
227a0 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20  BTREE_WRCSR .   
227b0 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28      || wrFlag==(
227c0 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45  BTREE_WRCSR|BTRE
227d0 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20  E_FORDELETE) .  
227e0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
227f0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
22800 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
22810 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
22820 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
22830 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
22840 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
22850 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
22860 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
22870 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
22880 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
22890 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
228a0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
228b0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
228c0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
228d0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
228e0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
228f0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
22900 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
22910 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b  (wrFlag?2:1)) );
22920 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
22930 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
22940 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
22950 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
22960 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
22970 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
22980 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
22990 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
229a0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
229b0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
229c0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
229d0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
229e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
229f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
22a00 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
22a10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
22a20 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
22a30 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74  g==0 || (pBt->bt
22a40 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
22a50 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20  D_ONLY)==0 );.. 
22a60 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
22a70 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
22a80 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69  pace(pBt);.    i
22a90 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
22aa0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
22ab0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
22ac0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
22ad0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
22ae0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
22af0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
22b00 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
22b10 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
22b20 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
22b30 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
22b40 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
22b50 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
22b60 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
22b70 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
22b80 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
22b90 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
22ba0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
22bb0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
22bc0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
22bd0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
22be0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
22bf0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
22c00 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
22c10 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
22c20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
22c30 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46   = wrFlag ? BTCF
22c40 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a  _WriteFlag : 0;.
22c50 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
22c60 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
22c70 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
22c80 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
22c90 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
22ca0 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
22cb0 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
22cc0 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
22cd0 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
22ce0 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
22cf0 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
22d00 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
22d10 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
22d20 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
22d30 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
22d40 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
22d50 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
22d60 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
22d70 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
22d80 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
22d90 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
22da0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
22db0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
22dc0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
22dd0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
22de0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
22df0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
22e00 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
22e10 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
22e20 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
22e30 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
22e70 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ea0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
22eb0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
22ec0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ef0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
22f00 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
22f10 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
22f20 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
22f30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
22f40 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
22f50 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
22f60 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
22f90 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
22fa0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
22fb0 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
22fc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22fd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
22fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
22ff0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
23000 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
23010 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
23020 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
23030 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
23040 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23050 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
23060 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
23070 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
23080 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
23090 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
230a0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
230b0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
230c0 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
230d0 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
230e0 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
230f0 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
23100 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
23110 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
23120 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
23130 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
23140 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
23150 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
23160 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
23170 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
23180 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
23190 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
231a0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
231b0 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
231c0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
231d0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
231e0 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
231f0 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
23200 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
23210 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
23220 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
23230 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
23240 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
23250 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
23260 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
23270 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
23280 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
23290 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
232a0 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
232b0 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
232c0 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
232d0 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
232e0 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
232f0 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
23300 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
23310 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
23320 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
23330 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23340 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
23350 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
23360 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
23370 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
23380 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
23390 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
233a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
233b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
233c0 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
233d0 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
233e0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
233f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
23400 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
23410 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
23420 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
23430 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
23440 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
23450 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
23460 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
23470 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
23480 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
23490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
234a0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
234b0 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Cur);.    assert
234c0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d  ( pBt->pCursor!=
234d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  0 );.    if( pBt
234e0 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20  ->pCursor==pCur 
234f0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  ){.      pBt->pC
23500 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
23510 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
23520 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a        BtCursor *
23530 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75  pPrev = pBt->pCu
23540 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a  rsor;.      do{.
23550 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
23560 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29  v->pNext==pCur )
23570 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  {.          pPre
23580 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
23590 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
235a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
235b0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76   }.        pPrev
235c0 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b   = pPrev->pNext;
235d0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41  .      }while( A
235e0 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a  LWAYS(pPrev) );.
235f0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
23600 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
23610 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
23620 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
23630 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
23640 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
23650 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
23660 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23670 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
23680 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  w);.    /* sqlit
23690 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
236a0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
236b0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
236c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
236d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
236e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
236f0 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
23700 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
23710 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
23720 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
23730 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
23740 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
23750 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
23760 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
23770 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
23780 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
23790 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
237a0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
237b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
237c0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
237d0 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
237e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
237f0 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
23800 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
23810 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
23820 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
23830 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
23840 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
23850 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
23860 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
23870 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
23880 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
23890 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
238a0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
238b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
238c0 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
238d0 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
238e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
238f0 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d  RUPT_DB || memcm
23900 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
23910 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
23920 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
23930 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
23940 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
23950 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51  #endif.static SQ
23960 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
23970 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
23980 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23990 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
239a0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
239b0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
239c0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43  r->iPage;.    pC
239d0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
239e0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
239f0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
23a00 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
23a10 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
23a20 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
23a30 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  >info);.  }else{
23a40 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
23a50 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  nfo(pCur);.  }.}
23a60 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
23a70 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
23a80 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
23a90 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
23aa0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
23ab0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
23ac0 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
23ad0 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
23ae0 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
23af0 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
23b00 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
23b10 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
23b20 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
23b30 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
23b40 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
23b50 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
23b60 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
23b70 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
23b80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23b90 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
23ba0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
23bb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
23bc0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
23bd0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
23be0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
23bf0 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  UG */.int sqlite
23c00 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
23c10 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a  lidNN(BtCursor *
23c20 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
23c30 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65   pCur!=0 );.  re
23c40 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
23c50 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
23c60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23c70 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
23c80 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72  e integer key or
23c90 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74   "rowid" for a t
23ca0 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54  able btree..** T
23cb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
23cc0 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20  nly valid for a 
23cd0 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70  cursor that is p
23ce0 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a  ointing into a.*
23cf0 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  * ordinary table
23d00 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
23d10 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
23d20 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20   an index btree 
23d30 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64  or.** is invalid
23d40 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  , the result of 
23d50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
23d60 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36  undefined..*/.i6
23d70 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  4 sqlite3BtreeIn
23d80 74 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f  tegerKey(BtCurso
23d90 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
23da0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23db0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23dc0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23dd0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23de0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
23df0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
23e00 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
23e10 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
23e20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
23e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23e40 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
23e50 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
23e60 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
23e70 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63  hat pCur is.** c
23e80 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
23e90 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65  g to.  For table
23ea0 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69   btrees, this wi
23eb0 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74  ll be the amount
23ec0 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f  .** of data.  Fo
23ed0 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20  r index btrees, 
23ee0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
23ef0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79   size of the key
23f00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
23f10 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
23f20 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
23f30 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
23f40 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
23f50 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
23f60 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
23f70 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
23f80 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
23f90 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
23fa0 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
23fb0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23fc0 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  ALID..*/.u32 sql
23fd0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
23fe0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
23ff0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
24000 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24010 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24020 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24030 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24040 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
24050 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
24060 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
24070 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  oad;.}../*.** Gi
24080 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
24090 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
240a0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
240b0 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
240c0 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
240d0 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
240e0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
240f0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
24100 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
24110 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
24120 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
24130 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
24140 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
24150 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
24160 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
24170 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
24180 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
24190 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
241a0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
241b0 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
241c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
241d0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
241e0 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
241f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
24200 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
24210 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
24220 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
24230 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
24240 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
24250 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
24260 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
24270 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
24280 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
24290 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
242a0 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
242b0 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
242c0 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
242d0 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
242e0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
242f0 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
24300 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
24310 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
24320 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
24330 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
24340 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
24350 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
24360 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
24370 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
24380 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
24390 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
243a0 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
243b0 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
243c0 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
243d0 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
243e0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
243f0 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
24400 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
24410 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
24420 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
24430 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
24440 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
24450 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
24460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
24470 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
24480 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244a0 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
244b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
244c0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
244d0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
244e0 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
244f0 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
24500 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
24510 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
24520 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
24530 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
24540 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
24550 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
24560 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
24570 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
24580 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
24590 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
245a0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
245b0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
245c0 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
245d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
245e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
245f0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
24600 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
24610 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
24620 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
24630 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
24640 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
24650 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
24660 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
24670 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
24680 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
24690 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
246a0 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
246b0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
246c0 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
246d0 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
246e0 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
246f0 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
24700 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
24710 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
24720 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
24730 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
24740 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
24750 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
24760 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
24770 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
24780 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
24790 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
247a0 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
247b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
247c0 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
247d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
247e0 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
247f0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
24800 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
24810 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
24820 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
24830 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
24840 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
24850 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
24860 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
24870 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
24880 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
24890 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
248a0 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
248b0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
248c0 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
248d0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
248e0 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
248f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24900 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
24910 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
24920 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
24930 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
24940 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
24950 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
24960 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
24970 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
24980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24990 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
249a0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
249b0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
249c0 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
249d0 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
249e0 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
249f0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
24a00 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
24a10 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
24a20 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
24a30 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
24a40 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
24a50 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
24a60 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
24a70 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
24a80 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
24a90 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
24aa0 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
24ab0 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
24ac0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
24ad0 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
24ae0 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
24af0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
24b00 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
24b10 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
24b20 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
24b30 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
24b40 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
24b50 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
24b60 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
24b70 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
24b80 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
24b90 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
24ba0 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
24bb0 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
24bc0 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
24bd0 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
24be0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
24bf0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
24c00 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
24c10 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
24c20 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
24c30 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
24c40 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
24c50 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
24c60 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
24c70 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
24c80 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
24c90 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
24ca0 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
24cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24cc0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
24cd0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
24ce0 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
24cf0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
24d00 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
24d10 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
24d20 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
24d30 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
24d40 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
24d50 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
24d60 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
24d70 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
24d80 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
24d90 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
24da0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
24db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24dc0 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
24dd0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
24de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24e00 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
24e10 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
24e20 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
24e30 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
24e40 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
24e50 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
24e60 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
24e70 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
24e80 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
24e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24ea0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
24eb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
24ec0 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
24ed0 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
24ee0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
24ef0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
24f00 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
24f10 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
24f20 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
24f30 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
24f40 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
24f50 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
24f60 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
24f70 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
24f80 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
24f90 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
24fa0 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
24fb0 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
24fc0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
24fd0 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65  .**   2: The ope
24fe0 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
24ff0 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74  . Do not populat
25000 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
25010 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
25020 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
25030 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
25040 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
25050 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
25060 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
25070 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
25080 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
25090 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
250a0 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
250b0 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
250c0 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
250d0 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
250e0 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
250f0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
25100 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
25110 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
25120 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
25130 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
25140 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ages and the.** 
25150 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  eOp argument is 
25160 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63  not 2, this func
25170 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
25180 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
25190 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c  lazily .** popul
251a0 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
251b0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
251c0 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
251d0 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
251e0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
251f0 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
25200 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
25210 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
25220 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
25230 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
25240 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
25250 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
25260 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
25270 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
25280 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
25290 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
252a0 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
252b0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
252c0 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
252d0 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
252e0 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
252f0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
25300 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
25310 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
25320 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
25330 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
25340 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
25350 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
25360 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
25370 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
25380 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
25390 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
253a0 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
253b0 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
253c0 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
253d0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
253e0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
253f0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
25400 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
25410 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
25420 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
25430 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
25440 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
25450 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
25460 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
25470 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
25480 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
25490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
254a0 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
254b0 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
254c0 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
254d0 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
254e0 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
254f0 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
25500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25510 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
25520 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
25530 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
25540 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
25550 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
25560 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
25570 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
25580 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
25590 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
255a0 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
255b0 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
255c0 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
255d0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
255e0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
255f0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
25600 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
25610 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
25620 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
25630 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
25640 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
25650 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
25660 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64  pBuf;.  int bEnd
25670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
256a0 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64  ding to end of d
256b0 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ata */.#endif.. 
256c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
256d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
256e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
256f0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
25700 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25710 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
25720 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
25730 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
25740 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25750 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d  .  assert( eOp!=
25760 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29  2 || offset==0 )
25770 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73  ;    /* Always s
25780 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e  tart from beginn
25790 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a  ing for eOp==2 *
257a0 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  /..  getCellInfo
257b0 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
257c0 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
257d0 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66  pPayload;.#ifdef
257e0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
257f0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62  VERFLOW_READ.  b
25800 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74  End = offset+amt
25810 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  ==pCur->info.nPa
25820 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20  yload;.#endif.  
25830 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61  assert( offset+a
25840 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  mt <= pCur->info
25850 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20  .nPayload );..  
25860 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64  assert( aPayload
25870 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   > pPage->aData 
25880 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28  );.  if( (uptr)(
25890 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65  aPayload - pPage
258a0 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d  ->aData) > (pBt-
258b0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43  >usableSize - pC
258c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29  ur->info.nLocal)
258d0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
258e0 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
258f0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
25900 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
25910 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20  n error.  The.  
25920 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c    ** conditional
25930 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79   above is really
25940 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61  :.    **    &aPa
25950 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
25960 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
25970 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
25980 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a  ableSize].    **
25990 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69   but is recast i
259a0 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20  nto its current 
259b0 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e  form to avoid in
259c0 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70  teger overflow p
259d0 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20  roblems.    */. 
259e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
259f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25a00 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
25a10 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
25a20 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
25a30 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
25a40 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
25a50 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
25a60 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
25a70 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
25a80 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
25a90 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
25aa0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
25ab0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
25ac0 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
25ad0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
25ae0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
25af0 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
25b00 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30 31 29   a, (eOp & 0x01)
25b10 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
25b20 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
25b30 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
25b40 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
25b50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
25b60 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
25b70 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a  o.nLocal;.  }...
25b80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25b90 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
25ba0 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
25bb0 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
25bc0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
25bd0 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
25be0 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
25bf0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
25c00 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
25c10 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
25c20 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
25c30 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20  o.nLocal]);..   
25c40 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72   /* If the BtCur
25c50 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  sor.aOverflow[] 
25c60 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
25c70 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
25c80 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20   it now..    ** 
25c90 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61  Except, do not a
25ca0 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c 6f  llocate aOverflo
25cb0 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a  w[] for eOp==2..
25cc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
25cd0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
25ce0 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
25cf0 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
25d00 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
25d10 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
25d20 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
25d30 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
25d40 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
25d50 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
25d60 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
25d70 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
25d80 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
25d90 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
25da0 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
25db0 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
25dc0 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
25dd0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
25de0 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
25df0 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28 70  if( eOp!=2 && (p
25e00 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
25e10 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
25e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
25e30 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
25e40 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
25e50 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
25e60 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
25e70 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
25e80 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c  Ovfl>pCur->nOvfl
25e90 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  Alloc ){.       
25ea0 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50   Pgno *aNew = (P
25eb0 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  gno*)sqlite3Real
25ec0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  loc(.           
25ed0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
25ee0 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66  , nOvfl*2*sizeof
25ef0 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  (Pgno).        )
25f00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e  ;.        if( aN
25f10 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
25f20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
25f30 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
25f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25f50 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41      pCur->nOvflA
25f60 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a  lloc = nOvfl*2;.
25f70 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
25f80 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
25f90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25fa0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
25fb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25fc0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43         memset(pC
25fd0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30  ur->aOverflow, 0
25fe0 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50  , nOvfl*sizeof(P
25ff0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gno));.        p
26000 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
26010 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b   BTCF_ValidOvfl;
26020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
26030 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
26040 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
26050 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
26060 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
26070 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
26080 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
26090 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
260a0 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
260b0 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
260c0 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
260d0 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
260e0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
260f0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20  ValidOvfl)!=0.  
26100 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65     && pCur->aOve
26110 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
26120 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20  lSize].    ){.  
26130 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
26140 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
26150 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
26160 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26170 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
26180 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
26190 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  lSize);.    }.. 
261a0 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
261b0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
261c0 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
261d0 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a  dx++){..      /*
261e0 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
261f0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
26200 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
26210 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
26220 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
26230 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
26240 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)!=0 ){.      
26250 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26260 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
26270 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
26280 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65     || pCur->aOve
26290 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
262a0 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 20  tPage.          
262b0 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
262c0 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _DB );.        p
262d0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
262e0 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
262f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
26300 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
26310 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
26320 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
26330 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
26340 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
26350 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
26360 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
26370 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
26380 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
26390 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
263a0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
263b0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
263c0 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
263d0 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
263e0 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
263f0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
26400 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
26410 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
26420 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
26430 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
26440 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
26450 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
26460 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c  that the aOverfl
26470 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20  ow[] array must 
26480 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63  be allocated bec
26490 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20  ause eOp!=2.    
264a0 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66      ** here.  If
264b0 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66   eOp==2, then of
264c0 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73  fset==0 and this
264d0 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72   branch is never
264e0 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20   taken..        
264f0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
26500 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20  t( eOp!=2 );.   
26510 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
26520 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
26530 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a  CF_ValidOvfl );.
26540 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26550 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
26560 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20  ==pBt->db );.   
26570 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
26580 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
26590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
265a0 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
265b0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
265c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
265d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
265e0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
265f0 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
26600 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
26610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26620 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
26630 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
26640 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
26650 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
26660 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
26670 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
26680 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
26690 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
266a0 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
266b0 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
266c0 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
266d0 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66         */.#ifdef
266e0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
266f0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
26700 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
26710 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20  e *fd;.#endif.  
26720 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
26730 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
26740 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
26750 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
26760 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
26770 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
26780 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
26790 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
267a0 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
267b0 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
267c0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
267d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
267e0 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
267f0 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
26800 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
26810 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
26820 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
26830 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
26840 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
26850 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
26860 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62 61     3) the databa
26870 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65  se is file-backe
26880 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  d, and.        *
26890 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73 20  *   4) there is 
268a0 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72  no open write-tr
268b0 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
268c0 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74         **   5) t
268d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
268e0 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  ot a WAL databas
268f0 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  e,.        **   
26900 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d  6) all data from
26910 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
26920 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20  ng read..       
26930 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73   **   7) at leas
26940 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
26950 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
26960 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
26970 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
26980 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
26990 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
269a0 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
269b0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
269c0 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
269d0 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
269e0 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
269f0 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
26a00 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
26a10 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
26a20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
26a30 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
26a40 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
26a50 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
26a60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
26a70 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30  f( (eOp&0x01)==0
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26aa0 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
26ab0 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
26ac0 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26af0 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
26b00 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d    && (bEnd || a=
26b10 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20  =ovflSize)      
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b30 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a          /* (6) *
26b40 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
26b50 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
26b60 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20  ==TRANS_READ    
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
26b90 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c      && (fd = sql
26ba0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
26bb0 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65  t->pPager))->pMe
26bc0 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29  thods     /* (3)
26bd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
26be0 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55  0==sqlite3PagerU
26bf0 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  seWal(pBt->pPage
26c00 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
26c10 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20     /* (5) */.   
26c20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d        && &pBuf[-
26c30 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20  4]>=pBufStart   
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26c60 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  7) */.        ){
26c70 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
26c80 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
26c90 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
26ca0 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
26cb0 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69      assert( aWri
26cc0 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b  te>=pBufStart );
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63           /* henc
26cf0 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20  e (7) */.       
26d00 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
26d10 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
26d20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26d30 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
26d40 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
26d50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
26d60 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
26d70 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
26d80 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
26d90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
26da0 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
26db0 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
26dc0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
26dd0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
26de0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
26df0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
26e00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
26e10 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
26e20 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
26e30 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
26e40 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20   ((eOp&0x01)==0 
26e50 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
26e60 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
26e70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
26e80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26e90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26ea0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
26eb0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
26ec0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
26ed0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
26ee0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
26ef0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
26f00 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
26f10 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
26f20 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
26f30 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62   (eOp&0x01), pDb
26f40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
26f50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
26f60 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
26f70 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
26f80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
26f90 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26fa0 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
26fb0 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
26fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26fd0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
26fe0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
26ff0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
27000 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27010 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
27020 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
27030 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
27040 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20  payload for the 
27050 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68 61  row at which tha
27060 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
27070 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
27080 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62  inting.  "amt" b
27090 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
270a0 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42  nsferred into pB
270b0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
270c0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
270d0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
270e0 20 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69   pCur can be poi
270f0 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20  nting to either 
27100 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e  a table or an in
27110 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49  dex b-tree..** I
27120 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  f pointing to a 
27130 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65  table btree, the
27140 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65  n the content se
27150 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20  ction is read.  
27160 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f  If.** pCur is po
27170 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64  inting to an ind
27180 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74  ex b-tree then t
27190 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69  he key section i
271a0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s read..**.** Fo
271b0 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  r sqlite3BtreePa
271c0 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c  yload(), the cal
271d0 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
271e0 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
271f0 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
27200 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74  lid row in the t
27210 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74  able.  For sqlit
27220 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68  e3BtreePayloadCh
27230 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20  ecked(), the.** 
27240 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20  cursor might be 
27250 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74  invalid or might
27260 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73 74   need to be rest
27270 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ored before bein
27280 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  g read..**.** Re
27290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
272a0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
272b0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
272c0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
272d0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
272e0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
272f0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
27300 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
27310 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
27320 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
27330 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
27340 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27350 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
27360 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
27370 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
27380 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27390 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
273a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
273b0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
273c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
273d0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
273e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
273f0 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
27400 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27410 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
27420 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27430 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
27440 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
27450 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
27460 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
27470 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29  d char*)pBuf, 0)
27480 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
27490 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
274a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
274b0 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  ePayloadChecked(
274c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
274d0 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
274e0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
274f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
27500 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
27510 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
27520 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27530 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
27540 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27550 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
27560 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
27570 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
27580 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
27590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
275a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
275b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
275c0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
275d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
275e0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
275f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27600 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
27610 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
27620 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
27630 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27640 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
27650 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
27660 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
27670 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
27680 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27690 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
276a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
276b0 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  BLOB */../*.** R
276c0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
276d0 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
276e0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
276f0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
27700 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
27710 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
27720 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
27730 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
27740 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
27750 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70   index btrees (p
27760 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29  Page->intKey==0)
27770 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61   and is the data
27780 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74   for.** table bt
27790 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
277a0 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d  Key==1). The num
277b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
277c0 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79  available.** key
277d0 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
277e0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
277f0 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
27800 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74  the value.** ret
27810 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
27820 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  e a valid pointe
27830 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
27840 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
27850 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
27860 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
27870 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
27880 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
27890 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
278a0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
278b0 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
278c0 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
278d0 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
278e0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
278f0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
27900 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
27910 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
27920 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
27930 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
27940 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
27950 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
27960 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
27970 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
27980 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
27990 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
279a0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
279b0 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
279c0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
279d0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
279e0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
279f0 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
27a00 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
27a10 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
27a20 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
27a30 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
27a40 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
27a50 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
27a60 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
27a70 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
27a80 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66  ic const void *f
27a90 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
27aa0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
27ab0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
27ac0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
27ad0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
27ae0 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20    u32 *pAmt     
27af0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
27b00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
27b10 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
27b20 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61  re */.){.  u32 a
27b30 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  mt;.  assert( pC
27b40 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
27b50 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
27b60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27b70 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
27b80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27b90 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
27ba0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27bb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
27bc0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
27bd0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
27be0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
27bf0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
27c00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
27c10 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27c20 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
27c30 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
27c40 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
27c50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
27c60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
27c70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
27c80 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ad>pCur->apPage[
27c90 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27ca0 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ata || CORRUPT_D
27cb0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
27cc0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
27cd0 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ad<pCur->apPage[
27ce0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27cf0 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54  ataEnd ||CORRUPT
27d00 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69  _DB);.  amt = (i
27d10 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65  nt)(pCur->apPage
27d20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
27d30 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e  DataEnd - pCur->
27d40 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a  info.pPayload);.
27d50 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
27d60 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d  .nLocal<amt ) am
27d70 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  t = pCur->info.n
27d80 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d  Local;.  *pAmt =
27d90 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28   amt;.  return (
27da0 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
27db0 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
27dc0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
27dd0 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
27de0 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
27df0 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
27e00 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
27e10 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
27e20 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
27e30 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
27e40 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
27e50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
27e60 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
27e70 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
27e80 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
27e90 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
27ea0 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
27eb0 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
27ec0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
27ed0 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
27ee0 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
27ef0 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
27f00 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
27f10 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
27f20 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
27f30 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
27f40 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
27f50 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
27f60 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
27f70 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
27f80 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
27f90 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
27fa0 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
27fb0 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
27fc0 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
27fd0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
27fe0 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
27ff0 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
28000 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
28010 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
28020 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  dFetch(BtCursor 
28030 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
28040 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
28050 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
28060 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Amt);.}.../*.** 
28070 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
28080 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
28090 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
280a0 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
280b0 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
280c0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
280d0 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
280e0 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
280f0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
28100 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
28110 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
28120 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
28130 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
28140 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
28150 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
28160 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
28170 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
28180 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
28190 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
281a0 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
281b0 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
281c0 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
281d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
281e0 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
281f0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
28200 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61  ewPgno){.  BtSha
28210 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
28220 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
28230 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28240 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
28250 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28260 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28270 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
28280 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
28290 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
282a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
282b0 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
282c0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
282d0 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
282e0 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
282f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
28300 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
28310 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
28320 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
28330 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
28340 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
28350 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43  ValidOvfl);.  pC
28360 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70  ur->iPage++;.  p
28370 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28380 3e 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72  >iPage] = 0;.  r
28390 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74  eturn getAndInit
283a0 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
283b0 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  o, &pCur->apPage
283c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20  [pCur->iPage],. 
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75         pCur, pCu
283f0 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
28400 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
28410 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  _DEBUG./*.** Pag
28420 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
28430 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
28440 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
28450 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
28460 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
28470 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
28480 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
28490 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
284a0 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
284b0 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
284c0 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
284d0 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
284e0 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
284f0 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
28500 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
28510 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
28520 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
28530 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
28540 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
28550 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
28560 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
28570 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
28580 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  {.  if( CORRUPT_
28590 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  DB ) return;  /*
285a0 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   The conditions 
285b0 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67  tested below mig
285c0 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20  ht not be true. 
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
285f0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
28600 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
28610 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
28620 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
28630 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
28640 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
28650 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
28660 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
28670 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
28680 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
28690 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
286a0 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
286b0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
286c0 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
286d0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
286e0 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
286f0 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
28700 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
28710 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
28720 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
28730 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
28740 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
28750 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
28760 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
28770 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
28780 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
28790 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
287a0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
287b0 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
287c0 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
287d0 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
287e0 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
287f0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
28800 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
28810 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28820 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
28830 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
28840 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
28850 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
28860 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28870 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28880 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
28890 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
288a0 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
288b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
288c0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
288d0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
288e0 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
288f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28900 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
28910 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28920 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
28930 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28940 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
28950 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
28960 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28970 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
28980 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28990 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  -1]->nCell );.  
289a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
289b0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
289c0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
289d0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
289e0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65  ValidOvfl);.  re
289f0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
28a00 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
28a10 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d  ur->iPage--]);.}
28a20 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
28a30 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
28a40 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
28a50 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
28a60 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
28a70 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
28a80 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
28a90 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
28aa0 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
28ab0 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
28ac0 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
28ad0 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
28ae0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
28af0 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
28b00 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
28b10 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
28b20 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
28b30 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
28b40 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
28b50 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
28b60 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
28b70 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
28b80 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
28b90 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
28ba0 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
28bb0 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
28bc0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
28bd0 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
28be0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f  URSOR_INVALID. O
28bf0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75  therwise, the cu
28c00 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70  rsor is set to p
28c10 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
28c20 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65  t.** cell locate
28c30 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f  d on the root (o
28c40 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20  r virtual root) 
28c50 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72  page and the cur
28c60 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20  sor state.** is 
28c70 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41  set to CURSOR_VA
28c80 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  LID..**.** If th
28c90 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
28ca0 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
28cb0 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75  , it may be assu
28cc0 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  med that the.** 
28cd0 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
28ce0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
28cf0 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f  the [virtual] ro
28d00 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65  ot-page is the e
28d10 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64  xpected .** kind
28d20 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20   of b-tree page 
28d30 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70  (i.e. if when op
28d40 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  ening the cursor
28d50 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
28d60 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61  not.** specify a
28d70 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
28d80 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
28d90 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35  e is set to 0x05
28da0 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64   or 0x0D,.** ind
28db0 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  icating a table 
28dc0 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68  b-tree, or if th
28dd0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65  e caller did spe
28de0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a  cify a KeyInfo .
28df0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65  ** structure the
28e00 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
28e10 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78  et to 0x02 or 0x
28e20 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  0A, indicating a
28e30 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65  n index.** b-tre
28e40 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
28e50 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
28e60 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
28e70 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
28e80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28e90 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
28ea0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28eb0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
28ec0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
28ed0 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
28ee0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
28ef0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
28f00 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
28f10 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
28f20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
28f30 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
28f40 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
28f50 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
28f60 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
28f70 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
28f80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28f90 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
28fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28fb0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
28fc0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
28fd0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
28fe0 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
28ff0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
29000 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
29010 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
29020 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
29030 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
29040 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  e ){.      do{. 
29050 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
29060 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29070 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20  ->iPage]!=0 );. 
29080 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
29090 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
290a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
290b0 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 20 20 7d 77  ge--]);.      }w
290c0 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67  hile( pCur->iPag
290d0 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  e);.      goto s
290e0 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a  kip_init;.    }.
290f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
29100 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
29110 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
29120 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
29130 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
29140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
29150 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
29160 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29  Cur->iPage==(-1)
29170 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   );.    rc = get
29180 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72  AndInitPage(pCur
29190 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70  ->pBtree->pBt, p
291a0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
291b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c  pCur->apPage[0],
291c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
291d0 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72           0, pCur
291e0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
291f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29210 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
29220 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
29230 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
29250 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->iPage = 0;.   
29260 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
29270 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29280 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a  0]->intKey;.  }.
29290 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
292a0 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
292b0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
292c0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
292d0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75   );..  /* If pCu
292e0 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
292f0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
29300 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
29310 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
29320 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74  .  ** expected t
29330 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
29340 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
29350 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
29360 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c  Info is.  ** NUL
29370 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
29380 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
29390 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
293a0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
293b0 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
293c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
293d0 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  or. .  **.  ** E
293e0 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
293f0 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65  of SQLite assume
29400 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74  d that this test
29410 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a   could not fail.
29420 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74    ** if the root
29430 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64   page was alread
29440 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68  y loaded when th
29450 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
29460 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a  called (i.e..  *
29470 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65  * if pCur->iPage
29480 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69  >=0). But this i
29490 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20  s not so if the 
294a0 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
294b0 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73  upted .  ** in s
294c0 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70  uch a way that p
294d0 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e  age pRoot is lin
294e0 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e  ked into a secon
294f0 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a  d b-tree table .
29500 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65    ** (or the fre
29510 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73  elist).  */.  as
29520 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74  sert( pRoot->int
29530 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d  Key==1 || pRoot-
29540 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
29550 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  if( pRoot->isIni
29560 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70  t==0 || (pCur->p
29570 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f  KeyInfo==0)!=pRo
29580 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ot->intKey ){.  
29590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
295a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
295b0 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a  }..skip_init:  .
295c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
295d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
295e0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
295f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29600 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
29610 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29620 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
29630 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
29640 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 69 66  >apPage[0];.  if
29650 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
29660 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
29670 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
29680 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
29690 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
296a0 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
296b0 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
296c0 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
296d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
296e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
296f0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
29700 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
29710 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
29720 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
29730 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
29740 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
29750 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
29760 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
29770 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
29780 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29790 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
297a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
297b0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
297c0 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
297d0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
297e0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
297f0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
29800 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
29810 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
29820 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
29830 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
29840 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
29850 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
29860 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
29870 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
29880 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
29890 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
298a0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
298b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
298c0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
298d0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
298e0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
298f0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29900 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29910 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29920 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
29930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29940 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
29950 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29960 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
29970 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29980 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29990 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
299a0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
299b0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
299c0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
299d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
299e0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
299f0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
29a00 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
29a10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29a20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29a30 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
29a40 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
29a50 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
29a60 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
29a70 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
29a80 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
29a90 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
29aa0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
29ab0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
29ac0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
29ad0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
29ae0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
29af0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
29b00 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
29b10 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
29b20 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
29b30 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
29b40 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
29b50 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
29b60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
29b70 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
29b80 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
29b90 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
29ba0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
29bb0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
29bc0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
29bd0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
29be0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
29bf0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
29c00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29c10 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
29c20 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
29c30 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29c40 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29c60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29c70 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
29c80 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
29c90 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29ca0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
29cb0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
29cc0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
29cd0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
29ce0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
29cf0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29d00 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
29d10 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
29d20 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
29d30 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
29d40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29d50 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64    }.  pCur->aiId
29d60 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
29d70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
29d80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29d90 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
29da0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
29db0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
29dc0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
29dd0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
29de0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
29df0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
29e00 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
29e10 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
29e20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
29e30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
29e40 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
29e50 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
29e60 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
29e70 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
29e80 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
29e90 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
29ea0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
29eb0 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
29ec0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29ed0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
29ee0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
29ef0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29f00 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
29f10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
29f20 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
29f30 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
29f40 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
29f50 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
29f60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29f70 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
29f80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29f90 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
29fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29fb0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
29fc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29fd0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
29fe0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
29ff0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2a000 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2a010 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
2a020 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2a030 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
2a040 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2a050 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
2a060 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2a070 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a080 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2a090 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
2a0a0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2a0b0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2a0c0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2a0d0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2a0e0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2a0f0 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2a100 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2a110 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2a120 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2a130 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2a140 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2a150 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
2a160 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2a170 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
2a180 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2a190 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2a1a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2a1b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a1c0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2a1d0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2a1e0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2a1f0 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
2a200 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2a210 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
2a220 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
2a230 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2a240 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
2a250 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2a260 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2a270 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2a280 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
2a290 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
2a2a0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
2a2b0 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
2a2c0 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
2a2d0 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
2a2e0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
2a2f0 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
2a300 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
2a310 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
2a320 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
2a330 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2a340 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
2a350 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
2a360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2a370 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2a380 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
2a390 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a3a0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
2a3b0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2a3c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a3d0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2a3e0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2a3f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a400 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2a410 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2a420 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a430 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
2a440 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2a450 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2a460 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a470 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2a480 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a490 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2a4a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2a4b0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2a4c0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2a4d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a4e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a4f0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2a500 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2a510 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2a520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a540 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2a550 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2a560 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ast;.      }else
2a570 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2a580 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2a590 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2a5a0 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  }.   .    }.  }.
2a5b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a5c0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2a5d0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2a5e0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2a5f0 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2a600 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2a610 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2a620 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2a630 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2a640 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2a650 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2a660 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2a670 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2a680 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2a690 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2a6a0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2a6b0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2a6c0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2a6d0 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2a6e0 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2a6f0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2a700 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2a710 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2a720 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2a730 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2a740 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2a750 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2a760 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2a770 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2a780 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2a790 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2a7a0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2a7b0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2a7c0 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2a7d0 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2a7e0 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2a7f0 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2a800 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2a810 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2a820 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2a830 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2a840 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2a850 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2a860 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2a870 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2a880 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2a890 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2a8a0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2a8b0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2a8c0 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2a8d0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2a8e0 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2a8f0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2a900 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a910 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2a920 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2a930 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2a940 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2a950 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2a960 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2a970 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2a980 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2a9a0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2a9b0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2a9c0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2a9d0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2a9e0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2a9f0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2aa00 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2aa10 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2aa20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2aa30 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
2aa40 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
2aa50 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
2aa60 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2aa70 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
2aa80 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
2aa90 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2aaa0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2aab0 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
2aac0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
2aad0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
2aae0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2aaf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ab00 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
2ab10 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
2ab20 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
2ab30 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
2ab40 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
2ab50 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
2ab60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2ab70 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
2ab80 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
2ab90 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2aba0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
2abb0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
2abc0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2abe0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
2abf0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
2ac00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
2ac10 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
2ac20 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
2ac30 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ac40 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ac50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2ac60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2ac70 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2ac80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2ac90 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
2aca0 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
2acb0 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
2acc0 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61  yInfo==0) );.  a
2acd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2ace0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2acf0 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30  D || (pIdxKey==0
2ad00 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74  )==(pCur->curInt
2ad10 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Key!=0) );..  /*
2ad20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
2ad30 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
2ad40 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
2ad50 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
2ad60 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
2ad70 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
2ad80 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
2ad90 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
2ada0 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20  ( pIdxKey==0.   
2adb0 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
2adc0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
2add0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2ade0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2adf0 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  y)!=0.  ){.    i
2ae00 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2ae10 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
2ae20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2ae30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ae40 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2ae50 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
2ae60 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
2ae70 73 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  st)!=0 && pCur->
2ae80 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
2ae90 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2aea0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
2aeb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2aec0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
2aed0 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52  IdxKey ){.    xR
2aee0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73  ecordCompare = s
2aef0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
2af00 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a  mpare(pIdxKey);.
2af10 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72      pIdxKey->err
2af20 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  Code = 0;.    as
2af30 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
2af40 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
2af50 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2af60 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
2af70 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2af80 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2af90 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
2afa0 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
2afb0 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
2afc0 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
2afd0 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
2afe0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2aff0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2b000 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2b010 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2b020 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2b030 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2b040 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
2b050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b060 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2b070 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2b080 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
2b090 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
2b0a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2b0b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
2b0c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2b0d0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2b0e0 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  l>0 );.  if( pCu
2b0f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b100 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
2b110 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2b120 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2b130 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2b140 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b150 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2b160 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
2b170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2b180 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2b190 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
2b1a0 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ==pCur->curIntKe
2b1b0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
2b1c0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
2b1d0 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
2b1e0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
2b1f0 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
2b200 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
2b210 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
2b220 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2b230 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b240 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
2b250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b270 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
2b280 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
2b290 2f 0a 73 71 6c 69 74 65 33 50 65 72 66 43 6e 74  /.sqlite3PerfCnt
2b2a0 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67  ++;..    /* pPag
2b2b0 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
2b2c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
2b2d0 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
2b2e0 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
2b2f0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
2b300 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
2b310 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
2b320 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
2b330 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
2b340 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
2b350 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
2b360 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
2b370 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
2b380 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
2b390 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
2b3a0 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
2b3b0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
2b3c0 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
2b3d0 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
2b3e0 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
2b3f0 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
2b400 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
2b410 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
2b420 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
2b430 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
2b440 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
2b450 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
2b460 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2b470 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
2b480 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2b490 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
2b4a0 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
2b4b0 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
2b4c0 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
2b4d0 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
2b4e0 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
2b4f0 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
2b500 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
2b510 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
2b520 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
2b530 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2b540 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2b550 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2b560 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
2b570 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
2b580 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
2b590 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
2b5a0 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
2b5b0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2b5c0 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2b5d0 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20  e, idx);.       
2b5e0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2b5f0 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  eyLeaf ){.      
2b600 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20      while( 0x80 
2b610 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b  <= *(pCell++) ){
2b620 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b630 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61   pCell>=pPage->a
2b640 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e  DataEnd ) return
2b650 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b660 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2b670 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b680 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
2b690 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
2b6a0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
2b6b0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
2b6c0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2b6d0 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2b6e0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2b6f0 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72  pr ){ c = -1; br
2b700 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2b710 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
2b720 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y>intKey ){.    
2b730 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2b740 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2b750 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2b760 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  +1; break; }.   
2b770 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2b790 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
2b7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2b7b0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2b7c0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2b7d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2b7e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b7f0 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
2b800 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
2b810 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
2b820 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
2b830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b840 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2b850 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
2b860 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20  lidNKey;.       
2b870 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
2b880 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
2b890 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
2b8a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2b8b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  0;.            *
2b8c0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2b8d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2b8e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2b8f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2b900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
2b910 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
2b920 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
2b930 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
2b940 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  = (lwr+upr)/2; *
2b950 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
2b960 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  lse{.      for(;
2b970 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ;){.        int 
2b980 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20  nCell;  /* Size 
2b990 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c  of the pCell cel
2b9a0 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  l in bytes */.  
2b9b0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2b9c0 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2b9d0 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20  age, idx);..    
2b9e0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
2b9f0 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
2ba00 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20  e-size is 65536 
2ba10 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
2ba20 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
2ba30 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
2ba40 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
2ba50 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
2ba60 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
2ba70 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
2ba80 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38  s less than 1638
2ba90 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20  4 bytes and may 
2baa0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
2bab0 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
2bac0 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
2bad0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
2bae0 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
2baf0 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
2bb00 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
2bb10 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
2bb20 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
2bb30 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
2bb40 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
2bb50 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
2bb60 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
2bb70 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
2bb80 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
2bb90 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
2bba0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
2bbb0 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
2bbc0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70         nCell = p
2bbd0 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
2bbe0 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67   if( nCell<=pPag
2bbf0 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
2bc00 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
2bc10 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
2bc20 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
2bc30 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
2bc40 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
2bc50 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
2bc60 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
2bc70 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
2bc80 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2bc90 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
2bca0 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
2bcb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2bcc0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2bcd0 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61  Cell+1==pPage->a
2bce0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2bcf0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2bd00 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2bd10 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
2bd20 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2bd30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
2bd40 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
2bd50 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
2bd60 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
2bd70 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
2bd80 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
2bd90 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b  Local.        ){
2bda0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2bdb0 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2bdc0 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
2bdd0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2bde0 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
2bdf0 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
2be00 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
2be10 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
2be20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2be30 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32  e( pCell+nCell+2
2be40 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
2be50 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
2be60 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2be70 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
2be80 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b  &pCell[2], pIdxK
2be90 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
2bea0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2beb0 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
2bec0 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
2bed0 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
2bee0 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
2bef0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
2bf00 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
2bf10 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
2bf20 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
2bf30 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
2bf40 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
2bf50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
2bf60 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
2bf70 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
2bf80 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
2bf90 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
2bfa0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
2bfb0 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20   be called. .   
2bfc0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2bfd0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65      ** If the re
2bfe0 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c  cord is corrupt,
2bff0 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70   the xRecordComp
2c000 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  are routine may 
2c010 72 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a  read.          *
2c020 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69  * up to two vari
2c030 6e 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64  nts past the end
2c040 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20   of the buffer. 
2c050 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20  An extra 18 .   
2c060 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20         ** bytes 
2c070 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c  of padding is al
2c080 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65  located at the e
2c090 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
2c0a0 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   in.          **
2c0b0 20 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65   case this happe
2c0c0 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ns.  */.        
2c0d0 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
2c0e0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
2c0f0 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79   const pCellBody
2c100 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65   = pCell - pPage
2c110 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
2c120 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2c130 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
2c140 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
2c150 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
2c160 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
2c170 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
2c180 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ey;.          te
2c190 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20  stcase( nCell<0 
2c1a0 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  );   /* True if 
2c1b0 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32  key size is 2^32
2c1c0 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20   or more */.    
2c1d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c1e0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  nCell==0 );  /* 
2c1f0 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65  Invalid key size
2c200 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30  :  0x80 0x80 0x0
2c210 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  0 */.          t
2c220 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2c230 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  1 );  /* Invalid
2c240 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2c250 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20   0x80 0x01 */.  
2c260 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2c270 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f  ( nCell==2 );  /
2c280 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20  * Minimum legal 
2c290 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a  index key size *
2c2a0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2c2b0 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20  nCell<2 ){.     
2c2c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c2d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2c2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2c2f0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2c300 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c310 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
2c320 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2c330 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20   nCell+18 );.   
2c340 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2c350 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
2c360 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c370 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2c380 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2c390 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2c3a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c3b0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2c3c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2c3d0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2c3e0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2c3f0 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2c400 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2c410 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2c420 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2);.          if
2c430 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2c440 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c450 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2c460 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2c470 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2c480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c490 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2c4a0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
2c4b0 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
2c4c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c4d0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2c4e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c4f0 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
2c500 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
2c510 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2c520 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
2c530 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
2c540 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2c550 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
2c560 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
2c570 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2c580 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
2c590 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
2c5a0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2c5b0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2c5c0 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
2c5d0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2c5e0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2c5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c600 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
2c610 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
2c620 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c630 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c640 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c650 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c660 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2c670 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
2c680 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
2c690 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2c6a0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
2c6b0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2c6c0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
2c6d0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2c6e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2c6f0 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2c700 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2c710 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2c720 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2c730 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20  wr+upr)/2 */.   
2c740 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
2c750 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
2c760 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74  1 || (pPage->int
2c770 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2c780 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65  eaf) );.    asse
2c790 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2c7a0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
2c7b0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c7c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c7d0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c7e0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
2c7f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2c800 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75  ell );.      pCu
2c810 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c820 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2c830 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2c840 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
2c850 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
2c860 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2c870 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f  h;.    }.moveto_
2c880 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20  next_layer:.    
2c890 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
2c8a0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
2c8b0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2c8c0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2c8d0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2c8e0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
2c8f0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2c900 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2c910 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
2c920 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
2c930 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c940 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
2c950 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2c960 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
2c970 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2c980 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  reak;.  }.moveto
2c990 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d  _finish:.  pCur-
2c9a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2c9b0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2c9c0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2c9d0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
2c9e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2c9f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
2ca00 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
2ca10 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
2ca20 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2ca30 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
2ca40 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
2ca50 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
2ca60 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
2ca70 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
2ca80 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
2ca90 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2caa0 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
2cab0 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
2cac0 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
2cad0 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
2cae0 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
2caf0 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
2cb00 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
2cb10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
2cb20 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2cb30 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
2cb40 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
2cb50 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
2cb60 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
2cb70 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
2cb80 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
2cb90 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
2cba0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
2cbb0 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
2cbc0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
2cbd0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
2cbe0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
2cbf0 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
2cc00 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
2cc10 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
2cc20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
2cc30 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
2cc40 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
2cc50 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2cc60 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
2cc70 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
2cc80 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
2cc90 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
2cca0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
2ccb0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2ccc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2ccd0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
2cce0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
2ccf0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2cd00 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
2cd10 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2cd20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2cd30 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  t().  That routi
2cd40 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2cd50 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2cd60 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2cd70 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
2cd80 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2cd90 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2cda0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c   to the next cel
2cdb0 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
2cdc0 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
2cdd0 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29  wer) btreeNext()
2cde0 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69   helper.** routi
2cdf0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2ce00 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2ce10 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2ce20 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72  ifferent page or
2ce30 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
2ce40 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2ce50 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2ce60 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a  ction will set *
2ce70 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20  pRes to 0 or 1. 
2ce80 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52   The initial *pR
2ce90 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  es value.** will
2cea0 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72   be 1 if the cur
2ceb0 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65  sor being steppe
2cec0 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  d corresponds to
2ced0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
2cee0 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75  d.** if this rou
2cef0 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
2cf00 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20  been skipped if 
2cf10 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68  that SQL index h
2cf20 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69  ad been.** a uni
2cf30 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65  que index.  Othe
2cf40 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72  rwise the caller
2cf50 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a   will have set *
2cf60 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pRes to zero..**
2cf70 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d   Zero is the com
2cf80 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74  mon case. The bt
2cf90 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2cfa0 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73  on is free to us
2cfb0 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
2cfc0 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20   *pRes value as 
2cfd0 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76  a hint to improv
2cfe0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62  e performance, b
2cff0 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ut the current.*
2d000 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  * SQLite btree i
2d010 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2d020 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68  es not. (Note th
2d030 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74  at the comdb2 bt
2d040 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ree.** implement
2d050 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74  ation does use t
2d060 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65  his hint, howeve
2d070 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  r.).*/.static SQ
2d080 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2d090 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75  t btreeNext(BtCu
2d0a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2d0b0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2d0c0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
2d0d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
2d0e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2d0f0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2d100 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2d110 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2d120 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2d130 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2d140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2d150 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  es==0 );.  if( p
2d160 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2d170 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2d180 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2d190 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2d1a0 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2d1b0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2d1c0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2d1d0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2d1e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d1f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2d200 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2d210 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2d220 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2d230 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2d240 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d250 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2d260 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2d270 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2d280 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2d290 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2d2a0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2d2b0 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2d2c0 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2d2d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2d2e0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2d2f0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2d300 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
2d310 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2d320 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d330 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d340 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2d350 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2d360 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2d370 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d380 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2d390 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
2d3a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2d3b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2d3c0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
2d3d0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2d3e0 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
2d3f0 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
2d400 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
2d410 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
2d420 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
2d430 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2d440 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
2d450 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
2d460 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
2d470 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
2d480 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
2d490 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
2d4a0 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
2d4b0 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2d4c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2d4d0 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
2d4e0 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
2d4f0 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
2d500 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2d510 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2d520 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
2d530 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
2d540 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
2d550 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2d560 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2d570 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2d580 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2d590 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
2d5a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2d5b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2d5c0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
2d5d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2d5e0 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2d5f0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2d600 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
2d610 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2d620 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2d630 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2d640 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2d650 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2d660 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
2d670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
2d690 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
2d6a0 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
2d6b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2d6c0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77  ->iPage];.    }w
2d6d0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2d6e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
2d6f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2d700 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2d710 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
2d720 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
2d730 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
2d740 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2d750 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d760 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2d770 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2d780 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2d790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2d7a0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2d7b0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2d7c0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20  Cur);.  }.}.int 
2d7d0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2d7e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2d7f0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d   int *pRes){.  M
2d800 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2d810 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2d820 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2d830 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2d840 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2d850 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
2d860 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
2d870 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2d880 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2d890 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2d8a0 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d  VALID );.  pCur-
2d8b0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2d8c0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2d8d0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2d8e0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2d8f0 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d  Ovfl);.  *pRes =
2d900 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2d910 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d920 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74  ALID ) return bt
2d930 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2d940 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  es);.  pPage = p
2d950 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2d960 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  ->iPage];.  if( 
2d970 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  (++pCur->aiIdx[p
2d980 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50  Cur->iPage])>=pP
2d990 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2d9a0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2d9b0 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2d9c0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
2d9d0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2d9e0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2d9f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
2da00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2da10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2da20 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2da30 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  t(pCur);.  }.}..
2da40 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
2da50 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
2da60 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
2da70 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
2da80 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
2da90 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
2daa0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
2dab0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
2dac0 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
2dad0 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
2dae0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2daf0 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
2db00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
2db10 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
2db20 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
2db30 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2db40 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2db50 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
2db60 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2db70 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2db80 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2db90 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
2dba0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2dbb0 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2dbc0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2dbd0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
2dbe0 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2dbf0 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2dc00 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
2dc10 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
2dc20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2dc30 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2dc40 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2dc50 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2dc60 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
2dc70 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2dc80 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
2dc90 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
2dca0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
2dcb0 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
2dcc0 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
2dcd0 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
2dce0 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
2dcf0 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
2dd00 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2dd10 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
2dd20 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
2dd30 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
2dd40 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
2dd50 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
2dd60 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2dd70 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
2dd80 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
2dd90 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
2dda0 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
2ddb0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
2ddc0 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
2ddd0 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
2dde0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
2ddf0 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2de00 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
2de10 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
2de20 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
2de30 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
2de40 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2de50 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
2de60 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
2de70 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
2de80 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2de90 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
2dea0 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74  owever.).*/.stat
2deb0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2dec0 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76  NE int btreePrev
2ded0 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2dee0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2def0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
2df00 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2df10 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2df20 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2df30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2df40 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
2df50 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20  t( *pRes==0 );. 
2df60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2df70 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2df80 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2df90 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2dfa0 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2dfb0 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74  Flags & (BTCF_At
2dfc0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
2dfd0 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
2dfe0 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ey))==0 );.  ass
2dff0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2e000 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66  nSize==0 );.  if
2e010 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2e020 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2e030 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2e040 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2e050 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2e060 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e070 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2e090 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2e0a0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2e0b0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2e0c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e0d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2e0e0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2e0f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2e100 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2e110 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2e120 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2e130 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2e140 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2e150 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2e160 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2e170 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c   pCur->skipNext<
2e180 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2e190 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2e1a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e1b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2e1c0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2e1d0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2e1e0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2e1f0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2e200 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
2e210 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2e220 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
2e230 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e240 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
2e250 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2e260 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
2e270 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2e280 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
2e290 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
2e2a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2e2b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
2e2c0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
2e2d0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
2e2e0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
2e2f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2e300 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
2e310 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2e320 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
2e330 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2e340 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2e350 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2e360 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2e370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2e380 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2e390 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2e3a0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2e3b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2e3c0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
2e3d0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2e3e0 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69  ags & (BTCF_Vali
2e3f0 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
2e400 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2e410 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
2e420 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2e430 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e440 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
2e450 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2e460 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2e480 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
2e490 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2e4a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2e4b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2e4c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2e4d0 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
2e4e0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
2e4f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2e500 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73  nt *pRes){.  ass
2e510 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2e520 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2e530 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2e540 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2e550 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
2e560 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2e570 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e580 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2e590 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2e5a0 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  D );.  *pRes = 0
2e5b0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2e5c0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
2e5d0 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
2e5e0 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
2e5f0 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  y);.  pCur->info
2e600 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
2e610 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2e620 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20  CURSOR_VALID.   
2e630 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  || pCur->aiIdx[p
2e640 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20  Cur->iPage]==0. 
2e650 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67    || pCur->apPag
2e660 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2e670 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  leaf==0.  ){.   
2e680 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65   return btreePre
2e690 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
2e6a0 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  );.  }.  pCur->a
2e6b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e6c0 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ]--;.  return SQ
2e6d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2e6e0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
2e6f0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
2e700 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2e710 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
2e720 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
2e730 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
2e740 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
2e750 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
2e760 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
2e770 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
2e780 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
2e790 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
2e7a0 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
2e7b0 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
2e7c0 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
2e7d0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
2e7e0 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
2e7f0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
2e800 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
2e810 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
2e820 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e830 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
2e840 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
2e850 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
2e860 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
2e870 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20  or.  *ppPage is 
2e880 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74  set to NULL in t
2e890 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
2e8a0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
2e8b0 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
2e8c0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
2e8d0 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69  then an effort i
2e8e0 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
2e8f0 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
2e900 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
2e910 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
2e920 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
2e930 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
2e940 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
2e950 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
2e960 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
2e970 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e980 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
2e990 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
2e9a0 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
2e9b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
2e9c0 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72   eMode parameter
2e9d0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   is BTALLOC_EXAC
2e9e0 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79  T and the nearby
2e9f0 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20   page exists.** 
2ea00 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
2ea10 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
2ea20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
2ea30 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
2ea40 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73    If.** eMode is
2ea50 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e   BTALLOC_LT then
2ea60 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e   the page return
2ea70 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20  ed will be less 
2ea80 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
2ea90 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e   to nearby if an
2eaa0 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  y such page exis
2eab0 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  ts.  If eMode is
2eac0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65   BTALLOC_ANY the
2ead0 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  n there.** are n
2eae0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  o restrictions o
2eaf0 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20  n which page is 
2eb00 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2eb10 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
2eb20 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
2eb30 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2eb40 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
2eb50 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
2eb60 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20  ppPage,      /* 
2eb70 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f  Store pointer to
2eb80 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2eb90 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  age here */.  Pg
2eba0 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20  no *pPgno,      
2ebb0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
2ebc0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65  e page number he
2ebd0 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61  re */.  Pgno nea
2ebe0 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rby,           /
2ebf0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70  * Search for a p
2ec00 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e  age near this on
2ec10 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20  e */.  u8 eMode 
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ec30 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20   BTALLOC_EXACT, 
2ec40 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42  BTALLOC_LT, or B
2ec50 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b  TALLOC_ANY */.){
2ec60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2ec70 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
2ec80 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
2ec90 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2eca0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
2ecb0 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
2ecc0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
2ecd0 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
2ece0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
2ecf0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
2ed00 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
2ed10 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
2ed20 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
2ed30 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
2ed40 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2ed50 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2ed60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2ed70 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2ed80 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2ed90 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  rt( eMode==BTALL
2eda0 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62  OC_ANY || (nearb
2edb0 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74  y>0 && IfNotOmit
2edc0 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  AV(pBt->autoVacu
2edd0 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31  um)) );.  pPage1
2ede0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
2edf0 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65    mxPage = btree
2ee00 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
2ee10 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2ee20 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20  : R-05119-02637 
2ee30 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2ee40 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2ee50 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20   offset 36.  ** 
2ee60 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68  stores stores th
2ee70 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2ee80 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
2ee90 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20  reelist. */.  n 
2eea0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2eeb0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2eec0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
2eed0 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
2eee0 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
2eef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ef00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2ef10 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
2ef20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
2ef30 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2ef40 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
2ef50 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
2ef60 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
2ef70 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
2ef80 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
2ef90 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
2efa0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
2efb0 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
2efc0 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63  /.    u32 nSearc
2efd0 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e  h = 0;   /* Coun
2efe0 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
2eff0 6f 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70  of search attemp
2f000 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  ts */.    .    /
2f010 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  * If eMode==BTAL
2f020 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20  LOC_EXACT and a 
2f030 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
2f040 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
2f050 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
2f060 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
2f070 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
2f080 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
2f090 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
2f0a0 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
2f0b0 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
2f0c0 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
2f0d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f0e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2f0f0 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
2f100 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20  LLOC_EXACT ){.  
2f110 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d      if( nearby<=
2f120 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2f130 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
2f140 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
2f150 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  by>0 );.        
2f160 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
2f170 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
2f180 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
2f190 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
2f1a0 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
2f1b0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2f1c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69  rn rc;.        i
2f1d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
2f1e0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
2f1f0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2f200 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
2f210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2f220 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54  se if( eMode==BT
2f230 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
2f240 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
2f250 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2f260 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
2f270 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
2f280 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
2f290 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
2f2a0 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
2f2b0 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
2f2c0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
2f2d0 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
2f2e0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
2f2f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f300 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
2f310 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f320 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2f330 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
2f340 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2f350 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
2f360 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
2f370 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
2f380 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
2f390 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
2f3a0 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
2f3b0 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
2f3c0 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
2f3d0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
2f3e0 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
2f3f0 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
2f400 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
2f410 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
2f420 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
2f430 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20  ALLOC_EXACT).   
2f440 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70   ** or until a p
2f450 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e  age less than 'n
2f460 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2f470 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2f480 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20  C_LT).    */.   
2f490 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
2f4a0 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
2f4b0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
2f4c0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2f4d0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
2f4e0 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54   R-01506-11053 T
2f4f0 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
2f500 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
2f510 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
2f520 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65    ** is the page
2f530 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
2f540 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ext freelist tru
2f550 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  nk page in the l
2f560 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ist or.        *
2f570 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69  * zero if this i
2f580 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c  s the last freel
2f590 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2f5a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
2f5b0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2f5c0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
2f5d0 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
2f5e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
2f5f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34  DENCE-OF: R-5984
2f600 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79  1-13798 The 4-by
2f610 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2f620 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2f630 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  32.        ** st
2f640 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75  ores the page nu
2f650 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
2f660 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72  t page of the fr
2f670 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20  eelist, or zero 
2f680 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  if.        ** th
2f690 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
2f6a0 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  pty. */.        
2f6b0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
2f6c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2f6d0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
2f6e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2f6f0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
2f700 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
2f710 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61  k>mxPage || nSea
2f720 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20  rch++ > n ){.   
2f730 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f740 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2f750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f760 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2f770 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
2f780 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
2f790 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2f7a0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2f7b0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
2f7c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
2f7d0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2f7e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f7f0 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d  assert( pTrunk!=
2f800 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2f810 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  t( pTrunk->aData
2f820 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  !=0 );.      /* 
2f830 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
2f840 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73  3523-04394 The s
2f850 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e  econd integer on
2f860 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
2f870 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  k page.      ** 
2f880 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2f890 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74   leaf page point
2f8a0 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a  ers to follow. *
2f8b0 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  /.      k = get4
2f8c0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2f8d0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
2f8e0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
2f8f0 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
2f900 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
2f910 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
2f920 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
2f930 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
2f940 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
2f950 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
2f960 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
2f970 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
2f980 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
2f990 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
2f9a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2f9b0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
2f9c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2f9d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f9e0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2f9f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2fa00 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2fa10 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2fa20 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2fa30 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
2fa40 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2fa50 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2fa60 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2fa70 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2fa80 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
2fa90 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2faa0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2fab0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2fac0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2fad0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2fae0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2faf0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2fb00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fb10 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
2fb20 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
2fb30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
2fb40 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
2fb50 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
2fb60 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
2fb70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2fb80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2fb90 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
2fba0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2fbb0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
2fbc0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2fbd0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
2fbe0 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20  ( searchList .  
2fbf0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65            && (ne
2fc00 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20  arby==iTrunk || 
2fc10 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26  (iTrunk<nearby &
2fc20 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
2fc30 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  _LE)) .      ){.
2fc40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
2fc50 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
2fc60 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
2fc70 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
2fc80 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2fc90 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
2fca0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2fcb0 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
2fcc0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2fcd0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2fce0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a  Trunk;.        *
2fcf0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2fd00 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
2fd10 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2fd20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2fd30 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2fd40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2fd50 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2fd60 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fd70 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fd80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fd90 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
2fda0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2fdb0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2fdc0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2fdd0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2fde0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2fdf0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2fe00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fe10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fe20 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
2fe30 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2fe40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2fe50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fe60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2fe70 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2fe80 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2fe90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fea0 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
2feb0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2fec0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2fed0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2fee0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2fef0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2ff00 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
2ff10 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2ff20 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
2ff30 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
2ff40 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
2ff50 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
2ff60 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
2ff70 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
2ff80 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
2ff90 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
2ffa0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
2ffb0 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
2ffc0 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
2ffd0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
2ffe0 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
2fff0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
30000 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
30010 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
30020 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
30030 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30040 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
30050 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
30060 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30070 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
30080 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
30090 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
300a0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
300b0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
300c0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
300d0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
300e0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
300f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30100 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30110 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
30120 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
30130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30140 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30150 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
30160 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
30170 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
30180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30190 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
301a0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
301b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
301c0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
301d0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
301e0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
301f0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
30200 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
30210 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
30220 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
30230 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
30240 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
30250 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
30260 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
30270 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
30280 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
30290 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
302a0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
302b0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
302c0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
302d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
302e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
302f0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
30300 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
30310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
30320 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
30330 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
30340 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
30350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30370 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
30380 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
30390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
303a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
303b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
303c0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
303d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
303e0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
303f0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
30400 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
30410 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
30420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30430 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
30440 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
30450 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
30460 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
30470 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
30480 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
30490 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
304a0 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
304b0 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
304c0 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
304d0 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
304e0 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
304f0 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
30500 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
30510 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
30520 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
30530 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
30540 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
30550 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
30560 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
30570 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
30580 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
30590 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
305a0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
305b0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
305c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
305d0 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
305e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
305f0 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
30600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
30610 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
30620 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
30630 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
30640 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
30650 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
30660 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
30670 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
30680 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
30690 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
306a0 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
306b0 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
306c0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
306d0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
306e0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
306f0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
30700 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
30710 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
30720 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
30730 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
30740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30750 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
30760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
30770 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
30780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
307a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
307b0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
307c0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
307d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
307e0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
307f0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
30800 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
30810 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
30820 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
30830 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
30840 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
30850 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30860 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
30870 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
30880 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
30890 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
308a0 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
308b0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
308c0 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
308d0 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
308e0 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
308f0 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
30900 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
30910 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
30920 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
30930 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
30940 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
30950 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
30960 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
30970 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
30980 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
30990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
309a0 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
309b0 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
309c0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
309d0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
309e0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
309f0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
30a00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30a10 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
30a20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
30a30 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30a40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30a50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
30a60 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
30a70 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
30a80 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
30a90 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
30aa0 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
30ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30ac0 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
30ad0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
30ae0 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
30af0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
30b00 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
30b10 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
30b20 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20  ONTENT : 0;.    
30b30 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
30b40 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
30b50 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
30b60 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
30b70 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
30b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30b90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30ba0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30bb0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
30bc0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30bd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30bf0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30c00 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
30c10 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
30c20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
30c30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
30c40 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
30c50 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
30c60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30c70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
30c80 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
30c90 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
30ca0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
30cb0 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
30cc0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
30cd0 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
30ce0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
30cf0 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70  o append a new p
30d00 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  age to the.    *
30d10 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
30d20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
30d30 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61  Normally, new pa
30d40 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ges allocated by
30d50 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20   this block can 
30d60 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  be requested fro
30d70 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  m the.    ** pag
30d80 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
30d90 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
30da0 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72  lag set. This pr
30db0 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72  events the pager
30dc0 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
30dd0 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20  ing to read the 
30de0 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  pages content fr
30df0 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72  om disk. However
30e00 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  , if the.    ** 
30e10 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
30e20 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
30e30 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  run one or more 
30e40 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
30e50 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c  um.    ** steps,
30e60 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77   then the page w
30e70 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61  e are about to a
30e80 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74  llocate may cont
30e90 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ain content.    
30ea0 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ** that is requi
30eb0 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
30ec0 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
30ed0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f  In this case, do
30ee0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20  .    ** not set 
30ef0 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66  the no-content f
30f00 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73  lag. This causes
30f10 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f   the pager to lo
30f20 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20  ad and journal. 
30f30 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
30f40 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62  t page content b
30f50 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
30f60 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  g it..    **.   
30f70 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
30f80 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74  e pager will not
30f90 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70   actually attemp
30fa0 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75  t to load or jou
30fb0 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e  rnal .    ** con
30fc0 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67  tent for any pag
30fd0 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f  e that really do
30fe0 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20  es lie past the 
30ff0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
31000 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
31010 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20  on disk. So the 
31020 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62  effects of disab
31030 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74  ling the no-cont
31040 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ent optimization
31050 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65  .    ** here are
31060 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f   confined to tho
31070 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69  se pages that li
31080 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e  e between the en
31090 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
310a0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61  database image a
310b0 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  nd the end of th
310c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
310d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
310e0 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d  bNoContent = (0=
310f0 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74  =IfNotOmitAV(pBt
31100 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f  ->bDoTruncate))?
31110 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
31120 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20  TENT:0;..    rc 
31130 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31140 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
31150 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
31160 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
31170 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  c;.    pBt->nPag
31180 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74  e++;.    if( pBt
31190 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
311a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
311b0 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  ) pBt->nPage++;.
311c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
311d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
311e0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
311f0 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
31200 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42  P_ISPAGE(pBt, pB
31210 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20  t->nPage) ){.   
31220 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
31230 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
31240 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
31250 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
31260 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
31270 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31280 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
31290 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
312a0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
312b0 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
312c0 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
312d0 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
312e0 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
312f0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
31300 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
31310 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  *pPg = 0;.      
31320 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
31330 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
31340 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
31350 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74  ap page)\n", pBt
31360 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20  ->nPage));.     
31370 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
31380 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age!=PENDING_BYT
31390 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
313a0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
313b0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
313c0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
313d0 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  Pg, bNoContent);
313e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
313f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31400 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31410 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
31420 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
31430 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
31440 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
31450 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
31460 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d  n rc;.      pBt-
31470 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
31480 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
31490 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
314a0 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e  E(pBt) ){ pBt->n
314b0 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  Page++; }.    }.
314c0 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62  #endif.    put4b
314d0 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42  yte(28 + (u8*)pB
314e0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
314f0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
31500 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
31510 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73  >nPage;..    ass
31520 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
31530 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31540 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
31550 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
31560 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
31570 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65  ppPage, bNoConte
31580 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nt);.    if( rc 
31590 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
315a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
315b0 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
315c0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
315d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
315e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
315f0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
31600 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  ;.      *ppPage 
31610 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  = 0;.    }.    T
31620 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
31630 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
31640 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
31650 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
31660 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
31670 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
31680 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
31690 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
316a0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
316b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
316c0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65  evTrunk);.  asse
316d0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
316e0 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  K || sqlite3Page
316f0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
31700 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
31710 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  )<=1 );.  assert
31720 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31730 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  || (*ppPage)->is
31740 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Init==0 );.  ret
31750 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
31760 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
31770 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61  s used to add pa
31780 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20  ge iPage to the 
31790 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
317a0 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20  ee-list. .** It 
317b0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
317c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
317d0 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f  already a part o
317e0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  f the free-list.
317f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
31800 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
31810 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
31820 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
31830 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20  is optional..** 
31840 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  If the caller ha
31850 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20  ppens to have a 
31860 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
31870 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a  emPage object .*
31880 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
31890 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61  to page iPage ha
318a0 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ndy, it may pass
318b0 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e   it as the secon
318c0 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68  d value. .** Oth
318d0 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70  erwise, it may p
318e0 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ass NULL..**.** 
318f0 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  If a pointer to 
31900 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  a MemPage object
31910 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
31920 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
31930 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65  t,.** its refere
31940 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74  nce count is not
31950 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73   altered by this
31960 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
31970 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
31980 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  e2(BtShared *pBt
31990 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50  , MemPage *pMemP
319a0 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29  age, Pgno iPage)
319b0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  {.  MemPage *pTr
319c0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
319d0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d          /* Free-
319e0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
319f0 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  */.  Pgno iTrunk
31a00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
31a10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31a20 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d   number of free-
31a30 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
31a40 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  */ .  MemPage *p
31a50 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
31a60 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ge1;      /* Loc
31a70 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
31a80 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50  page 1 */.  MemP
31a90 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
31aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ab0 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72  /* Page being fr
31ac0 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  eed. May be NULL
31ad0 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
31b00 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
31b10 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
31b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b30 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
31b40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
31b50 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
31b60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31b70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
31b80 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
31b90 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
31ba0 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  || iPage>1 );.  
31bb0 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
31bc0 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
31bd0 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
31be0 20 69 66 28 20 69 50 61 67 65 3c 32 20 29 20 72   if( iPage<2 ) r
31bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
31c00 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28  RUPT_BKPT;.  if(
31c10 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
31c20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
31c30 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
31c40 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
31c50 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
31c60 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
31c70 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
31c80 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
31c90 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
31ca0 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
31cb0 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
31cc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31cd0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
31ce0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
31cf0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
31d00 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
31d10 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
31d20 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
31d30 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
31d40 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
31d50 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
31d60 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
31d70 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
31d80 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  E ){.    /* If t
31d90 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
31da0 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
31db0 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
31dc0 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
31dd0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
31de0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
31df0 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
31e00 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
31e10 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
31e20 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
31e30 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29   &pPage, 0))!=0)
31e40 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
31e50 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
31e60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31e70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
31e80 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
31e90 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
31ea0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
31eb0 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
31ec0 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
31ed0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
31ee0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
31ef0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
31f00 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
31f10 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
31f20 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
31f30 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
31f40 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
31f50 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
31f60 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
31f70 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
31f80 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
31f90 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
31fa0 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
31fb0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
31fc0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
31fd0 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
31fe0 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
31ff0 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
32000 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
32010 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
32020 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
32030 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
32040 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
32050 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
32060 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
32070 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
32080 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
32090 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
320a0 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
320b0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
320c0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
320d0 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
320e0 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
320f0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
32100 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
32110 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
32120 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
32130 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
32140 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
32150 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
32160 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
32170 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
32180 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
32190 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
321a0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
321b0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
321c0 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
321d0 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
321e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
321f0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
32200 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
32210 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
32220 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
32230 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
32250 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32260 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
32270 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
32280 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
32290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
322a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
322b0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
322c0 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
322d0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
322e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
322f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
32300 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
32310 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
32320 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
32330 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
32340 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
32350 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
32360 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
32370 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
32380 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
32390 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
323a0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
323b0 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
323c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
323d0 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
323e0 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
323f0 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
32400 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
32410 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
32420 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
32430 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
32440 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
32450 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
32460 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
32470 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
32480 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
32490 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
324a0 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
324b0 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
324c0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
324d0 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
324e0 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
324f0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
32500 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
32510 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
32520 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
32530 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
32540 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
32550 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
32560 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
32570 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
32580 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
32590 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
325a0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
325b0 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
325c0 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
325d0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
325e0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
325f0 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
32600 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
32610 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
32620 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
32630 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
32640 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
32650 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
32660 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
32670 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
32680 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
32690 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
326a0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
326b0 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
326c0 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48   R-19920-11576 H
326d0 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65  owever, newer ve
326e0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
326f0 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20   still.      ** 
32700 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20  avoid using the 
32710 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73  last six entries
32720 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   in the freelist
32730 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61   trunk page arra
32740 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  y in.      ** or
32750 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73  der that databas
32760 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20  e files created 
32770 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
32780 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20  s of SQLite can 
32790 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  be.      ** read
327a0 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
327b0 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20  ns of SQLite..  
327c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
327d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
327e0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
327f0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
32800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32810 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
32820 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
32830 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
32840 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32850 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
32860 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
32870 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
32880 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74  Page && (pBt->bt
32890 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
328a0 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  URE_DELETE)==0 )
328b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
328c0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
328d0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
328e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
328f0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
32900 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
32910 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
32920 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
32930 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
32940 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
32950 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
32960 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
32970 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
32980 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
32990 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
329a0 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
329b0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
329c0 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
329d0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
329e0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
329f0 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
32a00 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
32a10 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
32a20 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
32a30 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
32a40 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
32a50 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
32a60 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
32a70 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
32a80 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
32a90 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
32aa0 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
32ab0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
32ac0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
32ad0 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
32ae0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
32af0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
32b00 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
32b10 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
32b20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
32b30 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
32b40 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
32b50 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32b60 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
32b70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32b80 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
32b90 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
32ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
32bb0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
32bc0 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
32bd0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
32be0 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
32bf0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
32c00 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
32c10 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
32c20 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
32c30 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
32c40 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
32c50 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
32c60 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
32c70 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
32c80 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
32c90 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
32ca0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
32cb0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
32cc0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
32cd0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
32ce0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
32cf0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
32d00 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
32d10 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
32d20 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
32d30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32d40 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
32d50 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
32d60 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
32d70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
32d80 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
32d90 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
32da0 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
32db0 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74  n Cell.  Write t
32dc0 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c  he.** local Cell
32dd0 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65   size (the numbe
32de0 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68  r of bytes on th
32df0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c  e original page,
32e00 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65   omitting.** ove
32e10 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53  rflow) into *pnS
32e20 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
32e30 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20  nt clearCell(.  
32e40 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
32e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
32e60 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
32e70 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  ns the Cell */. 
32e80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
32e90 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72  pCell,    /* Fir
32ea0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43  st byte of the C
32eb0 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ell */.  CellInf
32ec0 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
32ed0 20 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d    /* Size inform
32ee0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
32ef0 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  cell */.){.  BtS
32f00 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
32f10 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
32f20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
32f30 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
32f40 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53  .  u32 ovflPageS
32f50 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
32f60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
32f70 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
32f80 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
32f90 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
32fa0 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
32fb0 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  );.  if( pInfo->
32fc0 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e  nLocal==pInfo->n
32fd0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72  Payload ){.    r
32fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32ff0 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
33000 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
33010 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
33020 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
33030 66 28 20 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e  f( pCell+pInfo->
33040 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d  nSize-1 > pPage-
33050 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
33060 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  skPage ){.    re
33070 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
33080 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65  UPT_BKPT;  /* Ce
33090 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ll extends past 
330a0 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20  end of page */. 
330b0 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
330c0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b  get4byte(pCell +
330d0 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20   pInfo->nSize - 
330e0 34 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  4);.  assert( pB
330f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
33100 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
33110 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
33120 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
33130 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  fl = (pInfo->nPa
33140 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e  yload - pInfo->n
33150 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
33160 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
33170 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
33180 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
33190 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
331a0 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
331b0 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  d + ovflPageSize
331c0 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a  )<ovflPageSize).
331d0 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f    );.  while( nO
331e0 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
331f0 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
33200 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
33210 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
33220 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
33230 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
33240 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
33250 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
33260 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
33270 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
33280 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
33290 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
332a0 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
332b0 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
332c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
332d0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
332e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
332f0 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
33300 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
33310 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33320 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
33330 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
33340 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
33350 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
33360 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
33370 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
33380 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
33390 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20     }..    if( ( 
333a0 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c  pOvfl || ((pOvfl
333b0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
333c0 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  up(pBt, ovflPgno
333d0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26  ))!=0) ).     &&
333e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
333f0 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d  eRefcount(pOvfl-
33400 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20  >pDbPage)!=1.   
33410 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
33420 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20  re is no reason 
33430 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c  any cursor shoul
33440 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61  d have an outsta
33450 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
33460 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20  .      ** to an 
33470 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65  overflow page be
33480 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c  longing to a cel
33490 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  l that is being 
334a0 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e  deleted/updated.
334b0 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20  .      ** So if 
334c0 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72  there exists mor
334d0 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
334e0 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67  ence to this pag
334f0 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20  e, then it .    
33500 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65    ** must not re
33510 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66  ally be an overf
33520 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65  low page and the
33530 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
33540 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20  e corrupt. .    
33550 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66    ** It is helpf
33560 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69  ul to detect thi
33570 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  s before calling
33580 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73   freePage2(), as
33590 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50   .      ** freeP
335a0 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20  age2() may zero 
335b0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
335c0 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65  s if secure-dele
335d0 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20  te mode is.     
335e0 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   ** enabled. If 
335f0 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20  this 'overflow' 
33600 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
33610 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74  be a page that t
33620 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  he.      ** call
33630 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20  er is iterating 
33640 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67  through or using
33650 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77   in some other w
33660 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a  ay, this.      *
33670 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d  * can be problem
33680 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atic..      */. 
33690 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
336a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
336b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
336c0 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
336d0 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
336e0 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gno);.    }..   
336f0 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
33700 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33710 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
33720 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
33730 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
33740 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
33750 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
33760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33770 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
33780 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
33790 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
337a0 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
337b0 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
337c0 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
337d0 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
337e0 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
337f0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
33800 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
33810 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
33820 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
33830 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
33840 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
33850 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
33860 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
33870 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
33880 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
33890 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
338a0 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
338b0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
338c0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
338d0 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
338e0 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
338f0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
33900 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
33910 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
33920 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
33930 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
33940 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
33950 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
33960 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
33970 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
33980 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
33990 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
339a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
339b0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
339c0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
339d0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
339e0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
339f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
33a00 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
33a10 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
33a20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58  BtreePayload *pX
33a30 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c  ,        /* Payl
33a40 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20 74  oad with which t
33a50 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
33a60 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cell */.  int *p
33a70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
33a80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
33a90 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
33aa0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
33ab0 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
33ac0 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
33ad0 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
33ae0 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
33af0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
33b00 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
33b10 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
33b20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
33b30 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
33b40 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
33b50 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
33b60 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
33b70 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
33b80 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
33b90 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
33ba0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33bb0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
33bc0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
33bd0 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
33be0 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
33bf0 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
33c00 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
33c10 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
33c20 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
33c30 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
33c40 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
33c50 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
33c60 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
33c70 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
33c80 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
33c90 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
33ca0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
33cb0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
33cc0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
33cd0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
33ce0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
33cf0 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
33d00 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69  hildPtrSize;.  i
33d10 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
33d20 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   ){.    nPayload
33d30 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70   = pX->nData + p
33d40 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53  X->nZero;.    pS
33d50 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a  rc = pX->pData;.
33d60 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e      nSrc = pX->n
33d70 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
33d80 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
33d90 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e  eaf ); /* fillIn
33da0 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c  Cell() only call
33db0 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f  ed for leaves */
33dc0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
33dd0 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
33de0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
33df0 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61  yload);.    nHea
33e00 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
33e10 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
33e20 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b  , *(u64*)&pX->nK
33e30 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
33e40 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b    assert( pX->nK
33e50 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26  ey<=0x7fffffff &
33e60 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b  & pX->pKey!=0 );
33e70 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79  .    nSrc = nPay
33e80 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e  load = (int)pX->
33e90 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
33ea0 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e   pX->pKey;.    n
33eb0 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
33ec0 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
33ed0 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
33ee0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
33ef0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
33f00 64 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 79 6c  d */.  if( nPayl
33f10 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
33f20 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20  ocal ){.    n = 
33f30 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f  nHeader + nPaylo
33f40 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ad;.    testcase
33f50 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65  ( n==3 );.    te
33f60 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a  stcase( n==4 );.
33f70 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20      if( n<4 ) n 
33f80 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = 4;.    *pnSize
33f90 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c   = n;.    spaceL
33fa0 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  eft = nPayload;.
33fb0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65      pPrior = pCe
33fc0 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ll;.  }else{.   
33fd0 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d   int mn = pPage-
33fe0 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
33ff0 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61   = mn + (nPayloa
34000 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65  d - mn) % (pPage
34010 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
34020 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
34030 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
34040 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
34050 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
34060 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
34070 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50  ;.    if( n > pP
34080 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20  age->maxLocal ) 
34090 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63  n = mn;.    spac
340a0 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a  eLeft = n;.    *
340b0 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65  pnSize = n + nHe
340c0 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50  ader + 4;.    pP
340d0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  rior = &pCell[nH
340e0 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20  eader+n];.  }.  
340f0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
34100 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f  l[nHeader];..  /
34110 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
34120 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64  variables should
34130 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f   be set as follo
34140 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
34150 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  nPayload        
34160 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64     Total payload
34170 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20   size in bytes. 
34180 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20   **   pPayload  
34190 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77           Begin w
341a0 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68  riting payload h
341b0 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65  ere.  **   space
341c0 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70  Left          Sp
341d0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74  ace available at
341e0 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e   pPayload.  If n
341f0 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66  Payload>spaceLef
34200 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t,.  **         
34210 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
34220 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20  t means content 
34230 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20  must spill into 
34240 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
34250 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20    **   *pnSize  
34260 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f            Size o
34270 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c  f the local cell
34280 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f   (not counting o
34290 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20  verflow pages). 
342a0 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20   **   pPrior    
342b0 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74           Where t
342c0 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f  o write the pgno
342d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
342e0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a  erflow page.  **
342f0 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c  .  ** Use a call
34300 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
34310 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66  llPtr() to verif
34320 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  y that the value
34330 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72  s above.  ** wer
34340 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65  e computed corre
34350 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53  ctly..  */.#if S
34360 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a  QLITE_DEBUG.  {.
34370 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
34380 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  o;.    pPage->xP
34390 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
343a0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
343b0 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64     assert( nHead
343c0 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70  er==(int)(info.p
343d0 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29  Payload - pCell)
343e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
343f0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e  info.nKey==pX->n
34400 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Key );.    asser
34410 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e  t( *pnSize == in
34420 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  fo.nSize );.    
34430 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66  assert( spaceLef
34440 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  t == info.nLocal
34450 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
34460 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
34470 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20  ayload into the 
34480 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61  local Cell and a
34490 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76  ny extra into ov
344a0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a  erflow pages */.
344b0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
344c0 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
344d0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
344e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
344f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
34500 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
34510 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
34520 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
34530 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
34540 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
34550 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
34560 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
34570 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
34580 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
34590 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
345a0 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
345b0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
345c0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
345d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
345e0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
345f0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
34600 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
34610 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
34620 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
34630 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
34640 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
34650 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
34660 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
34670 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
34680 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
34690 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
346a0 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
346b0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
346c0 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
346d0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
346e0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
346f0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
34700 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
34710 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
34720 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
34730 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
34740 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
34750 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
34760 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
34770 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
34780 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
34790 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
347a0 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
347b0 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
347c0 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
347d0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
347e0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
347f0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
34800 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
34810 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
34820 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
34830 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
34840 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
34850 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
34860 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
34870 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
34880 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
34890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
348a0 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
348b0 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
348c0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
348d0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
348e0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
348f0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
34900 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
34910 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
34920 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
34930 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
34940 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
34950 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
34960 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
34970 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
34980 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
34990 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
349a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
349b0 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
349c0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
349d0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
349e0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
349f0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
34a00 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
34a10 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
34a20 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
34a30 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
34a40 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
34a50 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
34a60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34a70 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
34a80 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34a90 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
34aa0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
34ab0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
34ac0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
34ad0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
34ae0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
34af0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
34b00 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
34b10 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
34b20 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
34b30 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
34b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
34b50 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34b60 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
34b70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
34b80 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
34b90 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
34ba0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34bb0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
34bc0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
34bd0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
34be0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
34bf0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
34c00 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
34c10 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
34c20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
34c30 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
34c40 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
34c50 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
34c60 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
34c70 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
34c80 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
34c90 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
34ca0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
34cb0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
34cc0 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
34cd0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
34ce0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
34cf0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
34d00 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
34d10 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
34d20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
34d30 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
34d40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34d50 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
34d60 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
34d70 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
34d80 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
34d90 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
34da0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
34db0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
34dc0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
34dd0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
34de0 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
34df0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
34e00 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
34e10 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
34e20 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
34e30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34e40 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
34e50 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
34e60 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
34e70 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
34e80 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
34e90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
34ea0 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
34eb0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
34ec0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
34ed0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
34ee0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
34ef0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
34f00 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
34f10 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
34f20 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
34f30 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
34f40 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 7d  ceLeft -= n;.  }
34f50 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
34f60 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
34f70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34f80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
34f90 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
34fa0 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
34fb0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
34fc0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
34fd0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
34fe0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
34ff0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
35000 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
35010 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
35020 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
35030 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
35040 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
35050 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
35060 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
35070 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
35080 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
35090 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
350a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
350b0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
350c0 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
350d0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
350e0 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
350f0 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
35100 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
35110 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
35120 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
35130 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
35140 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
35150 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
35160 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
35170 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
35180 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
35190 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
351a0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
351b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
351c0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
351d0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
351e0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
351f0 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
35200 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
35210 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
35220 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
35230 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69  urn;.  assert( i
35240 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
35250 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
35260 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
35270 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  B || sz==cellSiz
35280 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
35290 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
352a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
352b0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
352c0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
352d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
352e0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
352f0 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
35300 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
35310 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e    ptr = &pPage->
35320 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b  aCellIdx[2*idx];
35330 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
35340 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
35350 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
35360 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
35370 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
35380 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
35390 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
353a0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
353b0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
353c0 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65   < (u32)get2byte
353d0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c  (&data[hdr+5]) |
353e0 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  | pc+sz > pPage-
353f0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
35400 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
35410 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
35420 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
35430 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
35440 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
35450 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
35460 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
35470 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
35480 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
35490 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
354a0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  Cell==0 ){.    m
354b0 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
354c0 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64  1], 0, 4);.    d
354d0 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
354e0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
354f0 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65  ta[hdr+5], pPage
35500 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
35510 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  e);.    pPage->n
35520 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Free = pPage->pB
35530 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
35540 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
35550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35560 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d          - pPage-
35570 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20  >childPtrSize - 
35580 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  8;.  }else{.    
35590 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72  memmove(ptr, ptr
355a0 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  +2, 2*(pPage->nC
355b0 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20  ell - idx));.   
355c0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
355d0 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
355e0 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  Cell);.    pPage
355f0 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
35600 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
35610 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
35620 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
35630 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
35640 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
35650 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
35660 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
35670 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
35680 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
35690 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
356a0 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
356b0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
356c0 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
356d0 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
356e0 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
356f0 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
35700 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
35710 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
35720 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
35730 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
35740 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
35750 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
35760 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
35770 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
35780 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
35790 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
357a0 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
357b0 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
357c0 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
357d0 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
357e0 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
357f0 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
35800 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
35810 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43  nted..**.** *pRC
35820 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f   must be SQLITE_
35830 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  OK when this rou
35840 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
35850 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
35860 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
35870 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
35880 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
35890 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
358a0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
358b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
358c0 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
358d0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
358e0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
358f0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
35900 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
35910 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
35920 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
35930 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
35940 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
35950 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
35960 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
35970 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
35980 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
35990 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
359a0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
359b0 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
359c0 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
359d0 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
359e0 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
359f0 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
35a00 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
35a10 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
35a20 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
35a30 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
35a40 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
35a50 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
35a60 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
35a70 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
35a80 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
35a90 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
35aa0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
35ab0 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
35ac0 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20  */.  u8 *pIns;  
35ad0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
35ae0 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  int in pPage->aC
35af0 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e  ellIdx[] where n
35b00 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  o cell inserted 
35b10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  */..  assert( *p
35b20 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  RC==SQLITE_OK );
35b30 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
35b40 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
35b50 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
35b60 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
35b70 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
35b80 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20  pBt)<=10921 );. 
35b90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
35ba0 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
35bb0 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f  Page->pBt) || CO
35bc0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
35bd0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
35be0 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
35bf0 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
35c00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72   );.  assert( Ar
35c10 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
35c20 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a  pOvfl)==ArraySiz
35c30 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29  e(pPage->aiOvfl)
35c40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
35c50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35c60 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
35c70 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
35c80 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  cell should norm
35c90 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f  ally be sized co
35ca0 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65  rrectly.  Howeve
35cb0 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61  r, when moving a
35cc0 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20  .  ** malformed 
35cd0 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
35ce0 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65   page to an inte
35cf0 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68  rior page, if th
35d00 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a  e cell size.  **
35d10 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65   wanted to be le
35d20 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f  ss than 4 but go
35d30 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  t rounded up to 
35d40 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74  4 on the leaf, t
35d50 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69  hen size.  ** mi
35d60 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ght be less than
35d70 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20   8 (leaf-size + 
35d80 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20  pointer) on the 
35d90 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20  interior node.  
35da0 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74  Hence.  ** the t
35db0 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c  erm after the ||
35dc0 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
35dd0 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20  g assert(). */. 
35de0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61   assert( sz==pPa
35df0 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
35e00 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
35e10 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
35e20 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
35e30 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
35e40 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
35e50 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
35e60 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
35e70 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c  py(pTemp, pCell,
35e80 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c   sz);.      pCel
35e90 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
35ea0 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
35eb0 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
35ec0 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
35ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
35ee0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35ef0 2b 2b 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61  ++;.    /* Compa
35f00 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72  rison against Ar
35f10 72 61 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20  raySize-1 since 
35f20 77 65 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65  we hold back one
35f30 20 65 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20   extra slot.    
35f40 2a 2a 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65  ** as a continge
35f50 6e 63 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ncy.  In other w
35f60 6f 72 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64  ords, never need
35f70 20 6d 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65   more than 3 ove
35f80 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f  rflow.    ** slo
35f90 74 73 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c  ts but 4 are all
35fa0 6f 63 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20  ocated, just to 
35fb0 62 65 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20  be safe. */.    
35fc0 61 73 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61  assert( j < Arra
35fd0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
35fe0 76 66 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50  vfl)-1 );.    pP
35ff0 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d  age->apOvfl[j] =
36000 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
36010 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28  e->aiOvfl[j] = (
36020 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57  u16)i;..    /* W
36030 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  hen multiple ove
36040 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68  rflows occur, th
36050 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65  ey are always se
36060 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a  quential and in.
36070 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72      ** sorted or
36080 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72  der.  This invar
36090 69 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61  iants arise beca
360a0 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  use multiple ove
360b0 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a  rflows can.    *
360c0 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65  * only occur whe
360d0 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69  n inserting divi
360e0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
360f0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64  he parent page d
36100 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c  uring.    ** bal
36110 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20  ancing, and the 
36120 64 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a  dividers are adj
36130 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64  acent and sorted
36140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
36150 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61  ert( j==0 || pPa
36160 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c  ge->aiOvfl[j-1]<
36170 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65  (u16)i ); /* Ove
36180 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64  rflows in sorted
36190 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73   order */.    as
361a0 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d  sert( j==0 || i=
361b0 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a  =pPage->aiOvfl[j
361c0 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76  -1]+1 );   /* Ov
361d0 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75  erflows are sequ
361e0 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73  ential */.  }els
361f0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
36200 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
36210 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36220 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
36230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36240 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
36250 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
36260 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
36270 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
36280 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
36290 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
362a0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
362b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61  .    assert( &da
362c0 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
362d0 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43  fset]==pPage->aC
362e0 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63  ellIdx );.    rc
362f0 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
36300 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
36310 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
36320 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
36330 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
36340 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
36350 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
36360 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
36370 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  g properties.   
36380 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
36390 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a  s successfully *
363a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
363b0 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  x >= 0 );.    as
363c0 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61  sert( idx >= pPa
363d0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
363e0 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20  *pPage->nCell+2 
363f0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
36400 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
36410 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
36420 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
36430 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
36440 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
36450 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
36460 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  cpy(&data[idx], 
36470 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
36480 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
36490 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
364a0 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
364b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73  ;.    }.    pIns
364c0 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49   = pPage->aCellI
364d0 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65  dx + i*2;.    me
364e0 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49  mmove(pIns+2, pI
364f0 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  ns, 2*(pPage->nC
36500 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70  ell - i));.    p
36510 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64  ut2byte(pIns, id
36520 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  x);.    pPage->n
36530 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69  Cell++;.    /* i
36540 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c  ncrement the cel
36550 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  l count */.    i
36560 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65  f( (++data[pPage
36570 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d  ->hdrOffset+4])=
36580 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d  =0 ) data[pPage-
36590 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b  >hdrOffset+3]++;
365a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
365b0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
365c0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  e->hdrOffset+3])
365d0 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
365e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
365f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36600 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
36610 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
36620 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
36630 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
36640 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
36650 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
36660 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
36670 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
36680 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
36690 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
366a0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
366b0 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
366c0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
366d0 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
366e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
366f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c  .}../*.** A Cell
36700 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  Array object con
36710 74 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66  tains a cache of
36720 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69   pointers and si
36730 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e  zes for a.** con
36740 73 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63  secutive sequenc
36750 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20  e of cells that 
36760 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e  might be held on
36770 20 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e   multiple pages.
36780 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
36790 63 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c  ct CellArray Cel
367a0 6c 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43  lArray;.struct C
367b0 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74  ellArray {.  int
367c0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
367d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
367e0 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
367f0 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  l[] */.  MemPage
36800 20 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20   *pRef;         
36810 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61   /* Reference pa
36820 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
36830 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36840 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
36850 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
36860 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
36870 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
36880 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
36890 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
368a0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  */.};../*.** Mak
368b0 65 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20  e sure the cell 
368c0 73 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64  sizes at idx, id
368d0 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d  x+1, ..., idx+N-
368e0 31 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  1 have been.** c
368f0 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omputed..*/.stat
36900 69 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65  ic void populate
36910 43 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72  CellCache(CellAr
36920 72 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ray *p, int idx,
36930 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
36940 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
36950 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  +N<=p->nCell );.
36960 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a    while( N>0 ){.
36970 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
36980 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b  pCell[idx]!=0 );
36990 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65  .    if( p->szCe
369a0 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20  ll[idx]==0 ){.  
369b0 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64      p->szCell[id
369c0 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43  x] = p->pRef->xC
369d0 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c  ellSize(p->pRef,
369e0 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29   p->apCell[idx])
369f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36a00 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
36a10 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20  PT_DB ||.       
36a20 20 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c         p->szCell
36a30 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e  [idx]==p->pRef->
36a40 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
36a50 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  f, p->apCell[idx
36a60 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ]) );.    }.    
36a70 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a  idx++;.    N--;.
36a80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
36a90 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
36aa0 74 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20  the Nth element 
36ab0 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61  of the cell arra
36ac0 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  y.*/.static SQLI
36ad0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20  TE_NOINLINE u16 
36ae0 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28  computeCellSize(
36af0 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e  CellArray *p, in
36b00 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
36b10 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65  N>=0 && N<p->nCe
36b20 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
36b30 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20  p->szCell[N]==0 
36b40 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  );.  p->szCell[N
36b50 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
36b60 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
36b70 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20  p->apCell[N]);. 
36b80 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c   return p->szCel
36b90 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75  l[N];.}.static u
36ba0 31 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a  16 cachedCellSiz
36bb0 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
36bc0 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
36bd0 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e  ( N>=0 && N<p->n
36be0 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d  Cell );.  if( p-
36bf0 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74  >szCell[N] ) ret
36c00 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
36c10 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75  ;.  return compu
36c20 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29  teCellSize(p, N)
36c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
36c40 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
36c50 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e  ns pointers to n
36c60 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65  Cell b-tree page
36c70 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20   cells. The .** 
36c80 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63  szCell[] array c
36c90 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
36ca0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
36cb0 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
36cc0 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65  ction.** replace
36cd0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  s the current co
36ce0 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70  ntents of page p
36cf0 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74  Pg with the cont
36d00 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ents of the cell
36d10 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  .** array..**.**
36d20 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   Some of the cel
36d30 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d  ls in apCell[] m
36d40 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
36d50 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54  stored in pPg. T
36d60 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
36d70 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f  works around pro
36d80 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
36d90 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61  this by making a
36da0 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a   copy of any .**
36db0 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f   such cells befo
36dc0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  re overwriting t
36dd0 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a  he page data..**
36de0 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e  .** The MemPage.
36df0 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69  nFree field is i
36e00 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
36e10 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20  is function. It 
36e20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
36e30 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
36e40 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
36e50 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
36e60 73 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69  static int rebui
36e70 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  ldPage(.  MemPag
36e80 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
36e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69            /* Edi
36ea0 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  t this page */. 
36eb0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
36ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ed0 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72   /* Final number
36ee0 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67   of cells on pag
36ef0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
36f00 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
36f10 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
36f20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31  of cells */.  u1
36f30 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20  6 *szCell       
36f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36f50 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73   Array of cell s
36f60 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  izes */.){.  con
36f70 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
36f80 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
36f90 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
36fa0 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67  of header on pPg
36fb0 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
36fc0 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
36fd0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
36fe0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
36ff0 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63  a for pPg */.  c
37000 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53  onst int usableS
37010 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e  ize = pPg->pBt->
37020 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38  usableSize;.  u8
37030 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20   * const pEnd = 
37040 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a  &aData[usableSiz
37050 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  e];.  int i;.  u
37060 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50  8 *pCellptr = pP
37070 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75  g->aCellIdx;.  u
37080 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  8 *pTmp = sqlite
37090 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
370a0 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  pPg->pBt->pPager
370b0 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a  );.  u8 *pData;.
370c0 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28  .  i = get2byte(
370d0 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  &aData[hdr+5]);.
370e0 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69    memcpy(&pTmp[i
370f0 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73  ], &aData[i], us
37100 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a  ableSize - i);..
37110 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a    pData = pEnd;.
37120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
37130 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
37140 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c   *pCell = apCell
37150 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  [i];.    if( SQL
37160 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c  ITE_WITHIN(pCell
37170 2c 61 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a  ,aData,pEnd) ){.
37180 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70        pCell = &p
37190 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74  Tmp[pCell - aDat
371a0 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  a];.    }.    pD
371b0 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d  ata -= szCell[i]
371c0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
371d0 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20  Cellptr, (pData 
371e0 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70  - aData));.    p
371f0 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  Cellptr += 2;.  
37200 20 20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43    if( pData < pC
37210 65 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20  ellptr ) return 
37220 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
37230 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  KPT;.    memcpy(
37240 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a  pData, pCell, sz
37250 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73  Cell[i]);.    as
37260 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d  sert( szCell[i]=
37270 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  =pPg->xCellSize(
37280 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43  pPg, pCell) || C
37290 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
372a0 20 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c   testcase( szCel
372b0 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c  l[i]!=pPg->xCell
372c0 53 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20  Size(pPg,pCell) 
372d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
372e0 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c   pPg->nFree fiel
372f0 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63  d is now set inc
37300 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61  orrectly. The ca
37310 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74  ller will fix it
37320 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  . */.  pPg->nCel
37330 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67  l = nCell;.  pPg
37340 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
37350 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ..  put2byte(&aD
37360 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a  ata[hdr+1], 0);.
37370 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
37380 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e  a[hdr+3], pPg->n
37390 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
373a0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c  e(&aData[hdr+5],
373b0 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b   pData - aData);
373c0 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20  .  aData[hdr+7] 
373d0 3d 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e  = 0x00;.  return
373e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
373f0 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
37400 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65  l[] contains nCe
37410 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62  ll pointers to b
37420 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72  -tree cells. Arr
37430 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e  ay szCell.** con
37440 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
37450 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
37460 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  such cell. This 
37470 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
37480 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65  s to .** add the
37490 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e   cells stored in
374a0 20 74 68 65 20 61 72 72 61 79 20 74 6f 20 70 61   the array to pa
374b0 67 65 20 70 50 67 2e 20 49 66 20 69 74 20 63 61  ge pPg. If it ca
374c0 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a  nnot (because .*
374d0 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  * the page needs
374e0 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e   to be defragmen
374f0 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  ted before the c
37500 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20  ells will fit), 
37510 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72  non-zero.** is r
37520 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
37530 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73  se, if the cells
37540 20 61 72 65 20 61 64 64 65 64 20 73 75 63 63 65   are added succe
37550 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ssfully, zero is
37560 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
37570 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65  .** Argument pCe
37580 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20  llptr points to 
37590 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
375a0 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  in the cell-poin
375b0 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61  ter array.** (pa
375c0 72 74 20 6f 66 20 70 61 67 65 20 70 50 67 29 20  rt of page pPg) 
375d0 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74  to populate. Aft
375e0 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30  er cell apCell[0
375f0 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ] is written to 
37600 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79  the.** page body
37610 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65  , a 16-bit offse
37620 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
37630 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f  pCellptr. And so
37640 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a   on, for each.**
37650 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72   cell in the arr
37660 61 79 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ay. It is the re
37670 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
37680 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
37690 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20  sure.** that it 
376a0 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77  is safe to overw
376b0 72 69 74 65 20 74 68 69 73 20 70 61 72 74 20 6f  rite this part o
376c0 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  f the cell-point
376d0 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  er array..**.** 
376e0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
376f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
37700 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20  pData points to 
37710 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
37720 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65   .** content are
37730 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49  a on page pPg. I
37740 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
37750 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69  e content area i
37760 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a  s extended,.** *
37770 70 70 44 61 74 61 20 69 73 20 75 70 64 61 74 65  ppData is update
37780 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
37790 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74  e new start of t
377a0 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a  he content area.
377b0 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
377c0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  ing..**.** Final
377d0 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65  ly, argument pBe
377e0 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  gin points to th
377f0 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  e byte immediate
37800 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
37810 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73  .** end of the s
37820 70 61 63 65 20 72 65 71 75 69 72 65 64 20 62 79  pace required by
37830 20 74 68 69 73 20 70 61 67 65 20 66 6f 72 20 74   this page for t
37840 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
37850 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c  area (for.** all
37860 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73   cells - not jus
37870 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64  t those inserted
37880 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
37890 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f  call). If the co
378a0 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75  ntent.** area mu
378b0 73 74 20 62 65 20 65 78 74 65 6e 64 65 64 20 74  st be extended t
378c0 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f  o before this po
378d0 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
378e0 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a  accomodate all.*
378f0 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  * cells in apCel
37900 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65  l[], then the ce
37910 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61  lls do not fit a
37920 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  nd non-zero is r
37930 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
37940 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72  ic int pageInser
37950 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67  tArray(.  MemPag
37960 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
37970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
37980 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74  e to add cells t
37990 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69  o */.  u8 *pBegi
379a0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
379b0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
379c0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
379d0 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  ray */.  u8 **pp
379e0 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
379f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
37a00 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74  UT: Page content
37a10 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a   -area pointer *
37a20 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
37a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37a40 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
37a50 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  o cell-pointer a
37a60 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  rea */.  int iFi
37a70 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
37a80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
37a90 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
37aa0 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20  to add */.  int 
37ab0 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
37ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37ad0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
37ae0 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a  o add to pPg */.
37af0 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41    CellArray *pCA
37b00 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20  rray            
37b10 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
37b20 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
37b30 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  i;.  u8 *aData =
37b40 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
37b50 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61  8 *pData = *ppDa
37b60 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d  ta;.  int iEnd =
37b70 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b   iFirst + nCell;
37b80 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
37b90 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64  PT_DB || pPg->hd
37ba0 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  rOffset==0 );   
37bb0 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
37bc0 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   on page 1 */.  
37bd0 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c  for(i=iFirst; i<
37be0 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iEnd; i++){.    
37bf0 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20  int sz, rc;.    
37c00 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73  u8 *pSlot;.    s
37c10 7a 20 3d 20 63 61 63 68 65 64 43 65 6c 6c 53 69  z = cachedCellSi
37c20 7a 65 28 70 43 41 72 72 61 79 2c 20 69 29 3b 0a  ze(pCArray, i);.
37c30 20 20 20 20 69 66 28 20 28 61 44 61 74 61 5b 31      if( (aData[1
37c40 5d 3d 3d 30 20 26 26 20 61 44 61 74 61 5b 32 5d  ]==0 && aData[2]
37c50 3d 3d 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d  ==0) || (pSlot =
37c60 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
37c70 67 2c 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b  g,sz,&rc))==0 ){
37c80 0a 20 20 20 20 20 20 69 66 28 20 28 70 44 61 74  .      if( (pDat
37c90 61 20 2d 20 70 42 65 67 69 6e 29 3c 73 7a 20 29  a - pBegin)<sz )
37ca0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
37cb0 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20   pData -= sz;.  
37cc0 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74      pSlot = pDat
37cd0 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  a;.    }.    /* 
37ce0 70 53 6c 6f 74 20 61 6e 64 20 70 43 41 72 72 61  pSlot and pCArra
37cf0 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 20 77 69 6c  y->apCell[i] wil
37d00 6c 20 6e 65 76 65 72 20 6f 76 65 72 6c 61 70 20  l never overlap 
37d10 6f 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  on a well-formed
37d20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
37d30 2e 20 20 42 75 74 20 74 68 65 79 20 6d 69 67 68  .  But they migh
37d40 74 20 66 6f 72 20 61 20 63 6f 72 72 75 70 74 20  t for a corrupt 
37d50 64 61 74 61 62 61 73 65 2e 20 20 48 65 6e 63 65  database.  Hence
37d60 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29 0a 20   use memmove(). 
37d70 20 20 20 2a 2a 20 73 69 6e 63 65 20 6d 65 6d 63     ** since memc
37d80 70 79 28 29 20 73 65 6e 64 73 20 53 49 47 41 42  py() sends SIGAB
37d90 4f 52 54 20 77 69 74 68 20 6f 76 65 72 6c 61 70  ORT with overlap
37da0 70 69 6e 67 20 62 75 66 66 65 72 73 20 6f 6e 20  ping buffers on 
37db0 4f 70 65 6e 42 53 44 20 2a 2f 0a 20 20 20 20 61  OpenBSD */.    a
37dc0 73 73 65 72 74 28 20 28 70 53 6c 6f 74 2b 73 7a  ssert( (pSlot+sz
37dd0 29 3c 3d 70 43 41 72 72 61 79 2d 3e 61 70 43 65  )<=pCArray->apCe
37de0 6c 6c 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 7c  ll[i].         |
37df0 7c 20 70 53 6c 6f 74 3e 3d 28 70 43 41 72 72 61  | pSlot>=(pCArra
37e00 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2b 73 7a 29  y->apCell[i]+sz)
37e10 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  .         || COR
37e20 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 6d  RUPT_DB );.    m
37e30 65 6d 6d 6f 76 65 28 70 53 6c 6f 74 2c 20 70 43  emmove(pSlot, pC
37e40 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d  Array->apCell[i]
37e50 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62  , sz);.    put2b
37e60 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70  yte(pCellptr, (p
37e70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a  Slot - aData));.
37e80 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20      pCellptr += 
37e90 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61  2;.  }.  *ppData
37ea0 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75   = pData;.  retu
37eb0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
37ec0 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
37ed0 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
37ee0 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
37ef0 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
37f00 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ell .** contains
37f10 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
37f20 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
37f30 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
37f40 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20  ion adds the.** 
37f50 73 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64  space associated
37f60 20 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20   with each cell 
37f70 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 68 61  in the array tha
37f80 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  t is currently s
37f90 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e  tored .** within
37fa0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67   the body of pPg
37fb0 20 74 6f 20 74 68 65 20 70 50 67 20 66 72 65 65   to the pPg free
37fc0 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d  -list. The cell-
37fd0 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68  pointers and oth
37fe0 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20  er.** fields of 
37ff0 74 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74  the page are not
38000 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
38010 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
38020 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
38030 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
38040 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
38050 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e-list..*/.stati
38060 63 20 69 6e 74 20 70 61 67 65 46 72 65 65 41 72  c int pageFreeAr
38070 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
38080 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
38090 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
380a0 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20  o edit */.  int 
380b0 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
380c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
380d0 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c  irst cell to del
380e0 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ete */.  int nCe
380f0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
38100 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c           /* Cell
38110 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
38120 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72   CellArray *pCAr
38130 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
38140 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
38150 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20  ls */.){.  u8 * 
38160 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
38170 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
38180 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
38190 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
381a0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38  sableSize];.  u8
381b0 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20   * const pStart 
381c0 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64  = &aData[pPg->hd
381d0 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50  rOffset + 8 + pP
381e0 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  g->childPtrSize]
381f0 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30  ;.  int nRet = 0
38200 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
38210 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b   iEnd = iFirst +
38220 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46   nCell;.  u8 *pF
38230 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ree = 0;.  int s
38240 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  zFree = 0;..  fo
38250 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45  r(i=iFirst; i<iE
38260 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  nd; i++){.    u8
38270 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61   *pCell = pCArra
38280 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20  y->apCell[i];.  
38290 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54    if( SQLITE_WIT
382a0 48 49 4e 28 70 43 65 6c 6c 2c 20 70 53 74 61 72  HIN(pCell, pStar
382b0 74 2c 20 70 45 6e 64 29 20 29 7b 0a 20 20 20 20  t, pEnd) ){.    
382c0 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20    int sz;.      
382d0 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 75 73  /* No need to us
382e0 65 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  e cachedCellSize
382f0 28 29 20 68 65 72 65 2e 20 20 54 68 65 20 73 69  () here.  The si
38300 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  zes of all cells
38310 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61   that.      ** a
38320 72 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  re to be freed h
38330 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
38340 20 63 6f 6d 70 75 74 69 6e 67 20 77 68 69 6c 65   computing while
38350 20 64 65 63 69 64 69 6e 67 20 77 68 69 63 68 0a   deciding which.
38360 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 6e        ** cells n
38370 65 65 64 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20  eed freeing */. 
38380 20 20 20 20 20 73 7a 20 3d 20 70 43 41 72 72 61       sz = pCArra
38390 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b 20 20 61  y->szCell[i];  a
383a0 73 73 65 72 74 28 20 73 7a 3e 30 20 29 3b 0a 20  ssert( sz>0 );. 
383b0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 21 3d       if( pFree!=
383c0 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a  (pCell + sz) ){.
383d0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
383e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
383f0 73 73 65 72 74 28 20 70 46 72 65 65 3e 61 44 61  ssert( pFree>aDa
38400 74 61 20 26 26 20 28 70 46 72 65 65 20 2d 20 61  ta && (pFree - a
38410 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  Data)<65536 );. 
38420 20 20 20 20 20 20 20 20 20 66 72 65 65 53 70 61           freeSpa
38430 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70 46  ce(pPg, (u16)(pF
3844