/ Hex Artifact Content
Login

Artifact 83a4b1b744fad3ff675f68bc4de73834ed0e31edb412097f54e33cf181bba1ee:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
5c60: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
5c70: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
5c80: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c90: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5cb0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5cd0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5ce0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5d00: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5d10: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5d20: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d40: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d50: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d60: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d70: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d80: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d90: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5da0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5db0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5dc0: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5dd0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5de0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5df0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5e00: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5e10: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5e20: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e30: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e60: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e70: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e80: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e90: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5ea0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f00: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5f10: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5f20: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f40: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f50: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f70: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f80: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5fb0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5fc0: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fd0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5ff0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
6000: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
6010: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
6020: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6030: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6040: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6050: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6060: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6070: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6080: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6090: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
60a0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
60b0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
60c0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60d0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60e0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60f0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
6100: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
6110: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
6120: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6130: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6140: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6150: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6160: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6170: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6180: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6190: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
61a0: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
61b0: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
61c0: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61e0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61f0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
6200: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
6210: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
6220: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6230: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6240: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6250: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6260: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6270: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6280: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6290: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
62a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
62b0: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
62c0: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62d0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62e0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62f0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
6300: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
6310: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
6320: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6330: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6340: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6350: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6360: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6370: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6380: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6390: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
63a0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
63b0: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
63c0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63d0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63e0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63f0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
6400: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
6410: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6420: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6430: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6450: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6460: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6470: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6480: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6490: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
64a0: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
64b0: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
64c0: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64d0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64e0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64f0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
6500: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
6510: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
6520: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6530: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6540: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6550: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6560: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6580: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6590: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
65a0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
65b0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
65c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65d0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65e0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65f0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
6600: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
6610: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
6620: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6630: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6640: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6650: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6660: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6670: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6690: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
66a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
66b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
66c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6700: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
6710: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
6720: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6730: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6740: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6750: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6760: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6770: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6780: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6790: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
67a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
67b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
67c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6800: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
6810: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
6820: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6830: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6840: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6850: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6860: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6870: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6880: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6890: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
68a0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
68b0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
68c0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68d0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6900: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6910: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
6920: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6940: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6950: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6960: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6970: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
69a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
69b0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
69c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6a00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6a10: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6a20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a40: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a50: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a60: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a70: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a90: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6aa0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ac0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6ad0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6af0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6b10: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6b20: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b30: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b40: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b50: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b60: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b70: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b80: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b90: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6ba0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6bb0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6bc0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6bd0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6be0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bf0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6c00: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6c10: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c30: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c40: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c50: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c60: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c80: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c90: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6ca0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6cb0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6cd0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6ce0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cf0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6d00: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6d10: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6d20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d50: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d60: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d70: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d80: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d90: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
6da0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6db0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
6dc0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
6dd0: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
6de0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6e00: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6e10: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6e20: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6e40: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6e50: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6e60: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
6e70: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
6e80: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
6e90: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
6ea0: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
6eb0: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
6ec0: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6ef0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6f00: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6f20: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6f30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f40: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
6f50: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
6f60: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
6f70: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
6f80: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
6f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6fa0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6fb0: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6fe0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ff0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
7000: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
7010: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
7020: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
7030: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
7040: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
7050: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
7060: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
7070: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
7080: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
7090: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
70a0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
70b0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
70c0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
70d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
70e0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
70f0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
7100: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
7110: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7120: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7130: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7150: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
7160: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7170: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
7180: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
7190: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
71a0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
71b0: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
71c0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
71d0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
71e0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
71f0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
7200: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
7210: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
7220: 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c 74  if( sqlite3Fault
7230: 53 69 6d 28 34 31 30 29 20 29 7b 0a 20 20 20 20  Sim(410) ){.    
7240: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
7250: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
7260: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
7270: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
7280: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
7290: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
72a0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
72b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
72c0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
72d0: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
72e0: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
72f0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
7300: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
7310: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
7320: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
7330: 44 20 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69  D );.    if( ski
7340: 70 4e 65 78 74 20 29 20 70 43 75 72 2d 3e 73 6b  pNext ) pCur->sk
7350: 69 70 4e 65 78 74 20 3d 20 73 6b 69 70 4e 65 78  ipNext = skipNex
7360: 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  t;.    if( pCur-
7370: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
7380: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
7390: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
73a0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
73b0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
73c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
73d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
73e0: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
73f0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
7400: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
7410: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
7420: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
7430: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7440: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
7450: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
7460: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
7470: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
7480: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
7490: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
74a0: 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  sition where.** 
74b0: 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  it was last plac
74c0: 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20  ed, or has been 
74d0: 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20  invalidated for 
74e0: 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  any other reason
74f0: 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e  ..** Cursors can
7500: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
7510: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
7520: 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74  ting at is delet
7530: 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75  ed out.** from u
7540: 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65  nder them, for e
7550: 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20  xample.  Cursor 
7560: 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20  might also move 
7570: 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73  if a btree.** is
7580: 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a   rebalanced..**.
7590: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
75a0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e  routine with a N
75b0: 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  ULL cursor point
75c0: 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  er returns false
75d0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
75e0: 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33  separate sqlite3
75f0: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
7600: 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20  re() routine to 
7610: 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72  restore a cursor
7620: 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72  .** back to wher
7630: 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  e it ought to be
7640: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
7650: 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a   returns true..*
7660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
7670: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
7680: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7690: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
76a0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
76b0: 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c 7c  (pCur).       ||
76c0: 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42 74   pCur==sqlite3Bt
76d0: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
76e0: 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  or() );.  assert
76f0: 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  ( offsetof(BtCur
7700: 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30 20  sor, eState)==0 
7710: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
7720: 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74 65  eof(pCur->eState
7730: 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==1 );.  return
7740: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21 3d   CURSOR_VALID !=
7750: 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a 0a   *(u8*)pCur;.}..
7760: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
7770: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b 65  ointer to a fake
7780: 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
7790: 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61 79   that will alway
77a0: 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c 73  s answer.** fals
77b0: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  e to the sqlite3
77c0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
77d0: 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61 62  ved() routine ab
77e0: 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a 2a  ove.  The fake.*
77f0: 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e 65  * cursor returne
7800: 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
7810: 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
7820: 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61 63  r Btree interfac
7830: 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20 2a  e..*/.BtCursor *
7840: 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65  sqlite3BtreeFake
7850: 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69 64  ValidCursor(void
7860: 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20 66  ){.  static u8 f
7870: 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52 53  akeCursor = CURS
7880: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73 65  OR_VALID;.  asse
7890: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43  rt( offsetof(BtC
78a0: 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d  ursor, eState)==
78b0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 42  0 );.  return (B
78c0: 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43 75  tCursor*)&fakeCu
78d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
78e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
78f0: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
7900: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
7910: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
7920: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
7930: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
7940: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
7950: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
7960: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
7970: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
7980: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
7990: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
79a0: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
79b0: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
79c0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
79d0: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
79e0: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
79f0: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
7a00: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
7a10: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
7a20: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
7a30: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
7a40: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
7a50: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
7a60: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
7a70: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
7a80: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
7a90: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
7aa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
7ab0: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
7ac0: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
7ad0: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
7ae0: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
7af0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7b00: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
7b10: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7b20: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
7b30: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7b40: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
7b50: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
7b60: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
7b70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
7b80: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7b90: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
7ba0: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
7bb0: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
7bc0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
7bd0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7be0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
7bf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
7c00: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
7c10: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
7c20: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7c30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
7c40: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7c50: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7c60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
7c70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7c80: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7c90: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
7ca0: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7cb0: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
7cc0: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
7cd0: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
7ce0: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
7cf0: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
7d00: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
7d10: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
7d20: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
7d30: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
7d40: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
7d50: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
7d60: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
7d70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
7d80: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
7d90: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7da0: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
7db0: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
7dc0: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
7dd0: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
7de0: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
7df0: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
7e00: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
7e10: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
7e20: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
7e30: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
7e40: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
7e50: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
7e60: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
7e70: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
7e80: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
7e90: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
7ea0: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
7eb0: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
7ec0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ed0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7ee0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
7ef0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
7f00: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
7f10: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
7f20: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
7f30: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
7f40: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
7f50: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
7f60: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
7f70: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
7f80: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
7f90: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
7fa0: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
7fb0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
7fc0: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
7fd0: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
7fe0: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
7ff0: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
8000: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
8010: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
8020: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
8030: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
8040: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
8050: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
8060: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
8070: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
8080: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
8090: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
80a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
80b0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
80c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
80d0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
80e0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
80f0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
8100: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
8110: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
8120: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
8130: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
8140: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
8150: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
8160: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
8170: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
8180: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
8190: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
81a0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
81b0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
81c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
81d0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
81e0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
81f0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
8200: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
8210: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
8220: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
8230: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
8240: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
8250: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
8260: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
8270: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
8280: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
8290: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
82a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
82b0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
82c0: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
82d0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
82e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
82f0: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
8300: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
8310: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
8320: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
8330: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
8340: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
8350: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8360: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8370: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
8380: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
8390: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
83a0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
83b0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
83c0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
83d0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
83e0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
83f0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
8400: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
8410: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8420: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
8430: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
8440: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
8450: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8460: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8470: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
8480: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
8490: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
84a0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
84b0: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
84c0: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
84d0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
84e0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
84f0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
8500: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
8510: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
8520: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
8530: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
8540: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8550: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8560: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
8570: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8580: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8590: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
85a0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
85b0: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
85c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
85d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
85e0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
85f0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 28 63  n;.  }.  if( ((c
8600: 68 61 72 2a 29 73 71 6c 69 74 65 33 50 61 67 65  har*)sqlite3Page
8610: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
8620: 65 29 29 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20  e))[0]!=0 ){.   
8630: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 62 79   /* The first by
8640: 74 65 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  te of the extra 
8650: 64 61 74 61 20 69 73 20 74 68 65 20 4d 65 6d 50  data is the MemP
8660: 61 67 65 2e 69 73 49 6e 69 74 20 62 79 74 65 2e  age.isInit byte.
8670: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 61 74 20  .    ** If that 
8680: 62 79 74 65 20 69 73 20 73 65 74 2c 20 69 74 20  byte is set, it 
8690: 6d 65 61 6e 73 20 74 68 69 73 20 70 61 67 65 20  means this page 
86a0: 69 73 20 61 6c 73 6f 20 62 65 69 6e 67 20 75 73  is also being us
86b0: 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 62  ed.    ** as a b
86c0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
86d0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
86e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
86f0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
8700: 69 74 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  it;.  }.  offset
8710: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
8720: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
8730: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
8740: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
8750: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8760: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
8770: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
8780: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
8790: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
87a0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70  bleSize-5 );.  p
87b0: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
87c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
87d0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
87e0: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
87f0: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
8800: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
8810: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
8820: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
8830: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
8840: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
8850: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
8860: 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d  ent));.    *pRC=
8870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
8880: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
8890: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
88a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
88b0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
88c0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
88d0: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
88e0: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
88f0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
8900: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
8910: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
8920: 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  f(pDbPage);.}../
8930: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
8940: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
8950: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
8960: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
8970: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
8980: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
8990: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
89a0: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
89b0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
89c0: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
89d0: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
89e0: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
89f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
8a00: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
8a10: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
8a20: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
8a30: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
8a40: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
8a50: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
8a60: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
8a70: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
8a80: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8a90: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
8aa0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
8ab0: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
8ac0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8ad0: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
8ae0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8af0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
8b00: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
8b10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8b20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
8b30: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
8b40: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
8b50: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
8b60: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8b70: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
8b80: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
8b90: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
8ba0: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
8bb0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
8bc0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
8bd0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
8be0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
8bf0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8c00: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
8c10: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8c20: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8c30: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
8c40: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8c50: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8c60: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8c70: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
8c80: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
8c90: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
8ca0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8cb0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
8cc0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
8cd0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
8ce0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
8cf0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
8d00: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
8d10: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
8d20: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
8d30: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
8d40: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
8d50: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
8d60: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
8d70: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
8d80: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
8d90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8da0: 52 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61  RUPT_PGNO(iPtrma
8db0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
8dc0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
8dd0: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
8de0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8df0: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
8e00: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
8e10: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
8e20: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
8e30: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
8e40: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8e50: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
8e60: 20 7a 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   z, rc).#endif..
8e70: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8e80: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8e90: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8ea0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8eb0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8ec0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
8ed0: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
8ee0: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
8ef0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8f00: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8f10: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
8f20: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8f30: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8f40: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8f50: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8f60: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8f70: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8f80: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8f90: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8fa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8fb0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8fc0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
8fd0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
8fe0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
8ff0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
9000: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
9010: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
9020: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
9030: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
9040: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
9050: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
9060: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
9070: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
9080: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
9090: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
90a0: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
90b0: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
90c0: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
90d0: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
90e0: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
90f0: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
9100: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9110: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
9120: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
9130: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
9140: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
9150: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
9160: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
9170: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
9180: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
9190: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
91a0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
91b0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
91c0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
91d0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
91e0: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
91f0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9200: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9210: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9220: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9230: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9240: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9250: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9260: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9270: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9280: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9290: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
92a0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
92b0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
92c0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
92d0: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
92e0: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
92f0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
9300: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
9310: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
9320: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
9330: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
9340: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
9350: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
9360: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
9370: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
9380: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
9390: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
93a0: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
93b0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
93c0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
93d0: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
93e0: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
93f0: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
9400: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
9410: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
9420: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
9430: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
9440: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
9450: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
9460: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
9470: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
9480: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
9490: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
94a0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
94b0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
94c0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
94d0: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
94e0: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
94f0: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9500: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9510: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
9520: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9530: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
9540: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
9550: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
9560: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
9570: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
9580: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
9590: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
95a0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
95b0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
95c0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
95d0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
95e0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
95f0: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9600: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
9610: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
9620: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
9630: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9640: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
9650: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
9660: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
9670: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
9680: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
9690: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
96a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
96b0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
96c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
96d0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
96e0: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
96f0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
9700: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
9710: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
9720: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
9730: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
9740: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9750: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
9760: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
9770: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
9780: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
9790: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
97a0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
97b0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
97c0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
97d0: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
97e0: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
97f0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
9800: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
9810: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
9820: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
9830: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
9840: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
9850: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
9860: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
9870: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
9880: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
9890: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
98a0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
98b0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
98c0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
98d0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
98e0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
98f0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9900: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9910: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9920: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9930: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9940: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9950: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9960: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9970: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9980: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
99a0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
99b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
99c0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
99d0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
99e0: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
99f0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
9a00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
9a10: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
9a20: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9a30: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9a40: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9a50: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9a60: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
9a70: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
9a80: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
9a90: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
9aa0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9ab0: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
9ac0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9ad0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9ae0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9af0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9b10: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9b20: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9b30: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9b40: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9b50: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9b60: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b80: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9b90: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9ba0: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
9bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9bc0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
9bd0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
9be0: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
9bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
9c00: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
9c10: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9c20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9c30: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9c40: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9c50: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9c60: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9c70: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9c80: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9c90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9ca0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9cb0: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
9cc0: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
9cd0: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
9ce0: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
9cf0: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
9d00: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
9d10: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
9d20: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9d30: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9d40: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9d50: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9d60: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9d70: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9d80: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9d90: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9da0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9db0: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9dc0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
9dd0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
9de0: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
9df0: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
9e00: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
9e10: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
9e20: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9e30: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9e40: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9e50: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9e60: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9e70: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9e80: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9e90: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9ea0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9eb0: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9ec0: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9ed0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
9ee0: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
9ef0: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
9f00: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
9f10: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9f20: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9f30: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9f40: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9f50: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9f60: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9f70: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
9f80: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
9f90: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
9fa0: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
9fb0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9fc0: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
9fd0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9ff0: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
a000: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
a010: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
a020: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
a030: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
a040: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
a050: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
a060: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
a070: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a080: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
a090: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
a0a0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
a0b0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
a0c0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a0d0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
a0e0: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
a0f0: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
a100: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
a110: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
a120: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
a130: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
a140: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
a150: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
a160: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
a170: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
a180: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
a190: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
a1a0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
a1b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
a1c0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
a1d0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
a1e0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
a1f0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
a200: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
a210: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
a220: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
a230: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
a240: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a250: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a260: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a270: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a280: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a290: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a2a0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a2b0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a2c0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a2d0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a2e0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
a2f0: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
a300: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
a310: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
a320: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
a330: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
a340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a350: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
a360: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
a370: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a380: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a390: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a3a0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
a3b0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
a3c0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
a3d0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
a3e0: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
a3f0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a400: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a410: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
a420: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
a430: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
a440: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
a450: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
a460: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
a470: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
a480: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
a490: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a4a0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
a4b0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
a4c0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a4d0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
a4e0: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
a4f0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
a500: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
a510: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a520: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
a530: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
a540: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
a550: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a560: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
a570: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
a580: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
a590: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
a5a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a5b0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
a5c0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
a5d0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
a5e0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
a5f0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
a600: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
a610: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
a620: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a630: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
a640: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
a650: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a660: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
a670: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
a680: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
a690: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
a6a0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
a6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
a6c0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
a6d0: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
a6e0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
a6f0: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
a700: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
a710: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
a720: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a730: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a740: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a750: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a770: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
a780: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
a790: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a7a0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a7b0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a7c0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
a7d0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a7e0: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
a7f0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
a800: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
a810: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a820: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
a830: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
a840: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
a850: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
a860: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
a870: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a880: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
a890: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
a8a0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
a8b0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
a8c0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
a8d0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
a8e0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
a8f0: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
a900: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
a910: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
a920: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
a930: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
a940: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
a950: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
a960: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a970: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
a980: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
a990: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
a9b0: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
a9c0: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
a9d0: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
a9e0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
a9f0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
aa00: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
aa10: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
aa20: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
aa30: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
aa40: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
aa50: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
aa60: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
aa90: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
aaa0: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aad0: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
aae0: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
aaf0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
ab00: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
ab10: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
ab20: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
ab30: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
ab40: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
ab50: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
ab60: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
ab70: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
ab80: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
ab90: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
aba0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
abb0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
abc0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
abd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
abe0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
abf0: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
ac00: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
ac10: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
ac20: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
ac30: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
ac40: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
ac50: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
ac60: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
ac70: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
ac80: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
ac90: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
aca0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
acb0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
acc0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
acd0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
ace0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
acf0: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
ad00: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
ad10: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
ad20: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
ad30: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
ad40: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
ad50: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
ad60: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
ad70: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
ad80: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
ad90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
ada0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
adb0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
adc0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
add0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
ade0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
adf0: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
ae00: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
ae10: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
ae20: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ae30: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
ae40: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
ae50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
ae60: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
ae70: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
ae80: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
ae90: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
aea0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
aeb0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
aec0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
aed0: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
aee0: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
aef0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
af00: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
af10: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
af20: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
af30: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
af40: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
af50: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
af60: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af70: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af80: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
af90: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
afa0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
afb0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
afc0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
afd0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
afe0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
aff0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
b000: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
b010: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
b020: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
b030: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
b040: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
b050: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
b060: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
b070: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
b080: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
b090: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
b0a0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
b0b0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
b0c0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
b0d0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
b0e0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
b0f0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
b100: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
b110: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
b120: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
b130: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
b140: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
b150: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
b160: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
b170: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
b180: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
b190: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
b1a0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
b1b0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
b1c0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
b1d0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
b1e0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
b1f0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
b200: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
b210: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
b220: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
b230: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
b240: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
b250: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b260: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b270: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
b280: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
b290: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
b2a0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
b2b0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
b2c0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
b2d0: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
b2e0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
b2f0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
b300: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
b310: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
b320: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
b330: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
b340: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b350: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
b360: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
b370: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b380: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
b390: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
b3a0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
b3b0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
b3c0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
b3d0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
b3e0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
b3f0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
b400: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
b410: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b420: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
b430: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
b440: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b460: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
b470: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 20 69 73  he cell pCell is
b480: 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20   currently part 
b490: 6f 66 20 70 61 67 65 20 70 53 72 63 20 62 75 74  of page pSrc but
b4a0: 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
b4b0: 20 62 65 20 70 61 72 74 0a 2a 2a 20 6f 66 20 70   be part.** of p
b4c0: 50 61 67 65 2e 20 20 28 70 53 72 63 20 61 6e 64  Page.  (pSrc and
b4d0: 20 70 50 61 67 65 72 20 61 72 65 20 6f 66 74 65   pPager are ofte
b4e0: 6e 20 74 68 65 20 73 61 6d 65 2e 29 20 20 49 66  n the same.)  If
b4f0: 20 70 43 65 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   pCell contains 
b500: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
b510: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
b520: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
b530: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
b540: 65 72 2d 6d 61 70 20 66 6f 72 0a 2a 2a 20 74 68  er-map for.** th
b550: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
b560: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 61 6c  that will be val
b570: 69 64 20 61 66 74 65 72 20 70 43 65 6c 6c 20 68  id after pCell h
b580: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 74 6f  as been moved to
b590: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
b5a0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
b5b0: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
b5c0: 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
b5d0: 2a 70 53 72 63 2c 20 75 38 20 2a 70 43 65 6c 6c  *pSrc, u8 *pCell
b5e0: 2c 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65  ,int *pRC){.  Ce
b5f0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
b600: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
b610: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
b620: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
b630: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
b640: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
b650: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
b660: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
b670: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
b680: 66 6c 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  fl;.    if( SQLI
b690: 54 45 5f 57 49 54 48 49 4e 28 70 53 72 63 2d 3e  TE_WITHIN(pSrc->
b6a0: 61 44 61 74 61 45 6e 64 2c 20 70 43 65 6c 6c 2c  aDataEnd, pCell,
b6b0: 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63   pCell+info.nLoc
b6c0: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  al) ){.      tes
b6d0: 74 63 61 73 65 28 20 70 53 72 63 21 3d 70 50 61  tcase( pSrc!=pPa
b6e0: 67 65 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 43  ge );.      *pRC
b6f0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
b700: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
b710: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
b720: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
b730: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a  &pCell[info.nSiz
b740: 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  e-4]);.    ptrma
b750: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
b760: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
b770: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
b780: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
b790: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
b7a0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
b7b0: 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73  page given. This
b7c0: 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e   routine reorgan
b7d0: 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69  izes cells withi
b7e0: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f  n the.** page so
b7f0: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
b800: 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f  no free-blocks o
b810: 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  n the free-block
b820: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72   list..**.** Par
b830: 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20  ameter nMaxFrag 
b840: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
b850: 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e  mount of fragmen
b860: 74 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d  ted space that m
b870: 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74  ay be.** present
b880: 20 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74   in the page aft
b890: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b8a0: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45  returns..**.** E
b8b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
b8c0: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
b8d0: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
b8e0: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
b8f0: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
b900: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b910: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
b920: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
b930: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
b940: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
b950: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
b960: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
b970: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
b980: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
b990: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
b9a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
b9b0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
b9c0: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
b9d0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b9e0: 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b  , int nMaxFrag){
b9f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba10: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
ba20: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba40: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
ba50: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
ba60: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
ba70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ba80: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
ba90: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
baa0: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
bab0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bac0: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
bad0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
bae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
baf0: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
bb00: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
bb10: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
bb20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
bb30: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
bb40: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
bb50: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
bb80: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
bb90: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
bba0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
bbb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bbc0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
bbd0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
bbe0: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
bbf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
bc00: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
bc10: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
bc20: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
bc30: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
bc40: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
bc50: 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20  char *src;      
bc60: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63    /* Source of c
bc70: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
bc80: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
bc90: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bca0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
bcb0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
bcc0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
bcd0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
bce0: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
bcf0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
bd00: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
bd10: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
bd20: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bd30: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
bd40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bd50: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bd60: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
bd70: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
bd80: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bd90: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
bda0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bdb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bdc0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bdd0: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
bde0: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
bdf0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
be00: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
be10: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
be20: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
be30: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
be40: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
be50: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
be60: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
be70: 61 5b 68 64 72 2b 33 5d 29 20 7c 7c 20 43 4f 52  a[hdr+3]) || COR
be80: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 69 43 65  RUPT_DB );.  iCe
be90: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
bea0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
beb0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
bec0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bed0: 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69  eSize;..  /* Thi
bee0: 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20  s block handles 
bef0: 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f  pages with two o
bf00: 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f  r fewer free blo
bf10: 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67  cks and nMaxFrag
bf20: 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66  .  ** or fewer f
bf30: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e  ragmented bytes.
bf40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
bf50: 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f   is faster to mo
bf60: 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20  ve the.  ** two 
bf70: 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20  (or one) blocks 
bf80: 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d  of cells using m
bf90: 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64  emmove() and add
bfa0: 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20 20   the required.  
bfb0: 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61  ** offsets to ea
bfc0: 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ch pointer in th
bfd0: 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
bfe0: 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73 20  rray than it is 
bff0: 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74  to .  ** reconst
c000: 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65 20  ruct the entire 
c010: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  page.  */.  if( 
c020: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
c030: 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20  <=nMaxFrag ){.  
c040: 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65    int iFree = ge
c050: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c060: 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 46  +1]);.    if( iF
c070: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  ree>usableSize-4
c080: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c090: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c0a0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 46  age);.    if( iF
c0b0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ree ){.      int
c0c0: 20 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79   iFree2 = get2by
c0d0: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29  te(&data[iFree])
c0e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  ;.      if( iFre
c0f0: 65 32 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  e2>usableSize-4 
c100: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c110: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c120: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  ge);.      if( 0
c130: 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74  ==iFree2 || (dat
c140: 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20  a[iFree2]==0 && 
c150: 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d  data[iFree2+1]==
c160: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  0) ){.        u8
c170: 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63   *pEnd = &data[c
c180: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
c190: 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  l*2];.        u8
c1a0: 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20   *pAddr;.       
c1b0: 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20   int sz2 = 0;.  
c1c0: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67        int sz = g
c1d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
c1e0: 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  ree+2]);.       
c1f0: 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62   int top = get2b
c200: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c210: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  );.        if( t
c220: 6f 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20  op>=iFree ){.   
c230: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c240: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c250: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c260: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
c270: 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20  iFree2 ){.      
c280: 20 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a      if( iFree+sz
c290: 3e 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e  >iFree2 ) return
c2a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c2b0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
c2c0: 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74         sz2 = get
c2d0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
c2e0: 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  e2+2]);.        
c2f0: 20 20 69 66 28 20 69 46 72 65 65 32 2b 73 7a 32    if( iFree2+sz2
c300: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 20   > usableSize ) 
c310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c320: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c330: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
c340: 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65  move(&data[iFree
c350: 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b  +sz+sz2], &data[
c360: 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65  iFree+sz], iFree
c370: 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20  2-(iFree+sz));. 
c380: 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73           sz += s
c390: 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  z2;.        }els
c3a0: 65 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 75  e if( iFree+sz>u
c3b0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c3c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c3d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c3e0: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c3f0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 62 72    }..        cbr
c400: 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20  k = top+sz;.    
c410: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c420: 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20  +(iFree-top) <= 
c430: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c440: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
c450: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
c460: 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70  [top], iFree-top
c470: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
c480: 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f  Addr=&data[cellO
c490: 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45  ffset]; pAddr<pE
c4a0: 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20  nd; pAddr+=2){. 
c4b0: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65           pc = ge
c4c0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
c4d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c           if( pc<
c4e0: 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74  iFree ){ put2byt
c4f0: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b  e(pAddr, pc+sz);
c500: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
c510: 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20  e if( pc<iFree2 
c520: 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64  ){ put2byte(pAdd
c530: 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20  r, pc+sz2); }.  
c540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c550: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
c560: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
c570: 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d   }.  }..  cbrk =
c580: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
c590: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c5a0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
c5b0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
c5c0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
c5d0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
c5e0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
c5f0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
c600: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c610: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
c620: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
c630: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c640: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
c650: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c660: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
c670: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
c680: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
c690: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
c6a0: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
c6b0: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
c6c0: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
c6d0: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
c6e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
c6f0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c700: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c720: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c730: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
c740: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
c750: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
c760: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
c770: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
c780: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
c790: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
c7a0: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
c7b0: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
c7c0: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
c7d0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c7f0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c800: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ge);.    }.    a
c810: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
c820: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
c830: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
c840: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c850: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
c860: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
c870: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
c880: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c890: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
c8a0: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
c8b0: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
c8c0: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
c8d0: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
c8e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c8f0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
c900: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
c910: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
c920: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
c930: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c940: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
c950: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
c960: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
c970: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
c980: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
c990: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
c9a0: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
c9b0: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61   size);.  }.  da
c9c0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a  ta[hdr+7] = 0;..
c9d0: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a   defragment_out:
c9e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c9f0: 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  ->nFree>=0 );.  
ca00: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
ca10: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
ca20: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
ca30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ca40: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
ca50: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
ca60: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
ca70: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
ca80: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
ca90: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
caa0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
cab0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
cac0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
cad0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
cae0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
caf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cb00: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
cb10: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
cb20: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
cb30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cb40: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
cb50: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
cb60: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
cb70: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
cb80: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
cb90: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
cba0: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
cbb0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
cbc0: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
cbd0: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
cbe0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
cbf0: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
cc00: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
cc10: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
cc20: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
cc30: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
cc40: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
cc50: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
cc60: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
cc70: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
cc80: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
cc90: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
cca0: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
ccb0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
ccc0: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
ccd0: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
cce0: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
ccf0: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
cd00: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
cd10: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
cd20: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
cd30: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
cd40: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
cd50: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
cd60: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
cd70: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
cd80: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
cd90: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
cda0: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
cdb0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
cdc0: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
cdd0: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
cde0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
cdf0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
ce00: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
ce10: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
ce20: 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce40: 50 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  Page data */.  i
ce50: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
ce60: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
ce70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
ce80: 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 70  ress of ptr to p
ce90: 63 20 2a 2f 0a 20 20 69 6e 74 20 70 63 20 3d 20  c */.  int pc = 
cea0: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
ceb0: 69 41 64 64 72 5d 29 3b 20 20 20 20 20 20 20 20  iAddr]);        
cec0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ced0: 61 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  a free slot */. 
cee0: 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20   int x;         
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
cf10: 78 63 65 73 73 20 73 69 7a 65 20 6f 66 20 74 68  xcess size of th
cf20: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  e slot */.  int 
cf30: 6d 61 78 50 43 20 3d 20 70 50 67 2d 3e 70 42 74  maxPC = pPg->pBt
cf40: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 6e  ->usableSize - n
cf50: 42 79 74 65 3b 20 20 2f 2a 20 4d 61 78 20 61 64  Byte;  /* Max ad
cf60: 64 72 65 73 73 20 66 6f 72 20 61 20 75 73 61 62  dress for a usab
cf70: 6c 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74  le slot */.  int
cf80: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cfb0: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
cfc0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
cfd0: 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  c>0 );.  while( 
cfe0: 70 63 3c 3d 6d 61 78 50 43 20 29 7b 0a 20 20 20  pc<=maxPC ){.   
cff0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d000: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
d010: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
d020: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
d030: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
d040: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
d050: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
d060: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
d070: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
d080: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
d090: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
d0a0: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
d0b0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
d0c0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
d0d0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
d0e0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
d0f0: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
d100: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
d110: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
d120: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  3 );.      if( x
d130: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <4 ){.        /*
d140: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d150: 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61  11498-58022 In a
d160: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
d170: 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f  ree page, the to
d180: 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  tal.        ** n
d190: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
d1a0: 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20  n fragments may 
d1b0: 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a  not exceed 60. *
d1c0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  /.        if( aD
d1d0: 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20  ata[hdr+7]>57 ) 
d1e0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20  return 0;..     
d1f0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
d200: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
d210: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
d220: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
d230: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
d240: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
d250: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
d260: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
d270: 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44  Data[iAddr], &aD
d280: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
d290: 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37       aData[hdr+7
d2a0: 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20  ] += (u8)x;.    
d2b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 2b 70 63    }else if( x+pc
d2c0: 20 3e 20 6d 61 78 50 43 20 29 7b 0a 20 20 20 20   > maxPC ){.    
d2d0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 6c 6f 74      /* This slot
d2e0: 20 65 78 74 65 6e 64 73 20 6f 66 66 20 74 68 65   extends off the
d2f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 75 73 61 62   end of the usab
d300: 6c 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  le part of the p
d310: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a  age */.        *
d320: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
d330: 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a  RUPT_PAGE(pPg);.
d340: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
d350: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d360: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
d370: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
d380: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
d390: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
d3a0: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
d3b0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
d3c0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
d3d0: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
d3e0: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
d3f0: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
d400: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
d410: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
d420: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
d430: 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a      iAddr = pc;.
d440: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
d450: 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20  e(&aData[pc]);. 
d460: 20 20 20 69 66 28 20 70 63 3c 3d 69 41 64 64 72     if( pc<=iAddr
d470: 2b 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  +size ){.      i
d480: 66 28 20 70 63 20 29 7b 0a 20 20 20 20 20 20 20  f( pc ){.       
d490: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 73 6c 6f   /* The next slo
d4a0: 74 20 69 6e 20 74 68 65 20 63 68 61 69 6e 20 69  t in the chain i
d4b0: 73 20 6e 6f 74 20 70 61 73 74 20 74 68 65 20 65  s not past the e
d4c0: 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  nd of the curren
d4d0: 74 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  t slot */.      
d4e0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
d4f0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
d500: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
d520: 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 3e 6d 61  .  }.  if( pc>ma
d530: 78 50 43 2b 6e 42 79 74 65 2d 34 20 29 7b 0a 20  xPC+nByte-4 ){. 
d540: 20 20 20 2f 2a 20 54 68 65 20 66 72 65 65 20 73     /* The free s
d550: 6c 6f 74 20 63 68 61 69 6e 20 65 78 74 65 6e 64  lot chain extend
d560: 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  s off the end of
d570: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
d580: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43   *pRc = SQLITE_C
d590: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67 29  ORRUPT_PAGE(pPg)
d5a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
d5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
d5c0: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
d5d0: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
d5e0: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
d5f0: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
d600: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
d610: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
d620: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
d630: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
d640: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
d650: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
d660: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
d670: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
d680: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
d690: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
d6a0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
d6b0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
d6c0: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
d6d0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
d6e0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
d6f0: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
d700: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
d710: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
d720: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
d730: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
d740: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
d750: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
d760: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
d770: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
d780: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
d790: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
d7a0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
d7b0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
d7c0: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
d7d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
d7e0: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
d7f0: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
d800: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
d810: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
d820: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
d830: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
d840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
d850: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
d860: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
d870: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
d880: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
d890: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d8a0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
d8b0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d8c0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
d8d0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
d8e0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d8f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
d900: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
d910: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
d920: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d940: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
d950: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
d960: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
d970: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d990: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
d9a0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
d9b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d9c0: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
d9d0: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
d9e0: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
d9f0: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
da00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
da10: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
da20: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
da30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
da40: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
da50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
da60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
da70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
da80: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
da90: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
daa0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
dab0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
dac0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
dad0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
dae0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
daf0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
db00: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
db10: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
db20: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
db30: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
db40: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
db50: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
db60: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
db70: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
db80: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
db90: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
dba0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
dbb0: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
dbc0: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
dbd0: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
dbe0: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
dbf0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
dc00: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
dc10: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
dc20: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
dc30: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
dc40: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
dc50: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
dc60: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
dc70: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
dc80: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
dc90: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
dca0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
dcb0: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
dcc0: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
dcd0: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
dce0: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
dcf0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
dd00: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
dd10: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
dd20: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
dd30: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
dd40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
dd50: 2a 20 62 79 20 62 74 72 65 65 43 6f 6d 70 75 74  * by btreeComput
dd60: 65 46 72 65 65 53 70 61 63 65 28 29 20 2a 2f 0a  eFreeSpace() */.
dd70: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
dd80: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
dd90: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
dda0: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
ddb0: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
ddc0: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
ddd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
dde0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
ddf0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
de00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
de10: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
de20: 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70 20  ace between gap 
de30: 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20  and top for one 
de40: 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65  more cell pointe
de50: 72 2c 0a 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  r,.  ** and if t
de60: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e  he freelist is n
de70: 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73  ot empty, then s
de80: 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66  earch the.  ** f
de90: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
dea0: 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65  for a slot big e
deb0: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
dec0: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20   the request..  
ded0: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
dee0: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
def0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
df00: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
df10: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20  e( gap==top );. 
df20: 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32   if( (data[hdr+2
df30: 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d  ] || data[hdr+1]
df40: 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20  ) && gap+2<=top 
df50: 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63  ){.    u8 *pSpac
df60: 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74  e = pageFindSlot
df70: 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26  (pPage, nByte, &
df80: 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70  rc);.    if( pSp
df90: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ace ){.      ass
dfa0: 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74  ert( pSpace>=dat
dfb0: 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20 64  a && (pSpace - d
dfc0: 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20  ata)<65536 );.  
dfd0: 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74      *pIdx = (int
dfe0: 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29  )(pSpace - data)
dff0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
e000: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
e010: 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20  lse if( rc ){.  
e020: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e030: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
e040: 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64  he request could
e050: 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65   not be fulfille
e060: 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69  d using a freeli
e070: 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a  st slot.  Check.
e080: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64    ** to see if d
e090: 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69  efragmentation i
e0a0: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
e0b0: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
e0c0: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
e0d0: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
e0e0: 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61  yte>top ){.    a
e0f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
e100: 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54  ell>0 || CORRUPT
e110: 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _DB );.    asser
e120: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
e130: 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  =0 );.    rc = d
e140: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
e150: 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67  age, MIN(4, pPag
e160: 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42  e->nFree - (2+nB
e170: 79 74 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20  yte)));.    if( 
e180: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
e190: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
e1a0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
e1b0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
e1c0: 65 72 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ert( gap+2+nByte
e1d0: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
e1e0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
e1f0: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
e200: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
e210: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
e220: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
e230: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
e240: 61 2e 20 20 54 68 65 20 62 74 72 65 65 43 6f 6d  a.  The btreeCom
e250: 70 75 74 65 46 72 65 65 53 70 61 63 65 28 29 20  puteFreeSpace() 
e260: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
e270: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
e280: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
e290: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
e2a0: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
e2b0: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
e2c0: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
e2d0: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
e2e0: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
e2f0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
e300: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
e310: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
e320: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
e330: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
e340: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
e350: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e360: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
e370: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
e380: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
e390: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
e3a0: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
e3b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e3c0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
e3d0: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
e3e0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
e3f0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
e400: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
e410: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
e420: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
e430: 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74  ge->aData[iStart
e440: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
e450: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
e460: 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  s iSize bytes..*
e470: 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72  *.** Adjacent fr
e480: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61  eeblocks are coa
e490: 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76  lesced..**.** Ev
e4a0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
e4b0: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
e4c0: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
e4d0: 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70 61 63  eComputeFreeSpac
e4e0: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
e4f0: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
e500: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
e510: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
e520: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
e530: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
e540: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
e550: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
e560: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
e570: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
e580: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
e590: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
e5a0: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
e5b0: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
e5c0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
e5d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
e5e0: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
e5f0: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
e600: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
e610: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
e620: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
e630: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
e640: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
e650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e670: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
e680: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
e690: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
e6a0: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6c0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
e6d0: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
e6e0: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
e710: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
e720: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
e730: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
e760: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
e770: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
e780: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
e790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e7a0: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
e7b0: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20   iSize */.  u16 
e7c0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7e0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
e7f0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
e800: 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d   */.  u32 iEnd =
e810: 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b   iStart + iSize;
e820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
e830: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
e840: 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65 72  he iStart buffer
e850: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
e860: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
e870: 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50  e->aData;   /* P
e880: 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  age content */..
e890: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e8a0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
e8b0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
e8c0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
e8d0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
e8e0: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
e8f0: 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d  T_DB || iStart>=
e900: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
e910: 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  +6+pPage->childP
e920: 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  trSize );.  asse
e930: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
e940: 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d  | iEnd <= pPage-
e950: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
e960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e970: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e980: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
e990: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e9a0: 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f   iSize>=4 );   /
e9b0: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
e9c0: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
e9d0: 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 50  sert( iStart<=pP
e9e0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e9f0: 53 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20  Size-4 );..  /* 
ea00: 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65  The list of free
ea10: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
ea20: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
ea30: 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20  r.  Find the .  
ea40: 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c  ** spot on the l
ea50: 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74  ist where iStart
ea60: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
ea70: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20  ted..  */.  hdr 
ea80: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
ea90: 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72  et;.  iPtr = hdr
eaa0: 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61   + 1;.  if( data
eab0: 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64  [iPtr+1]==0 && d
eac0: 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a  ata[iPtr]==0 ){.
ead0: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30      iFreeBlk = 0
eae0: 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66  ;  /* Shortcut f
eaf0: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
eb00: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
eb10: 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73   empty */.  }els
eb20: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69  e{.    while( (i
eb30: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
eb40: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29  te(&data[iPtr]))
eb50: 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  <iStart ){.     
eb60: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50   if( iFreeBlk<iP
eb70: 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  tr+4 ){.        
eb80: 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20  if( iFreeBlk==0 
eb90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
eba0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ebb0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
ebc0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
ebd0: 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c    iPtr = iFreeBl
ebe0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
ebf0: 20 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65 2d   iFreeBlk>pPage-
ec00: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
ec10: 2d 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  -4 ){.      retu
ec20: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ec30: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
ec40: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
ec50: 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c   iFreeBlk>iPtr |
ec60: 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b  | iFreeBlk==0 );
ec70: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  .  .    /* At th
ec80: 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a  is point:.    **
ec90: 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20      iFreeBlk:   
eca0: 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  First freeblock 
ecb0: 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72  after iStart, or
ecc0: 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20   zero if none.  
ecd0: 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20    **    iPtr:   
ece0: 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20      The address 
ecf0: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  of a pointer to 
ed00: 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a  iFreeBlk.    **.
ed10: 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
ed20: 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20  see if iFreeBlk 
ed30: 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73  should be coales
ed40: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
ed50: 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20   of iStart..    
ed60: 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  */.    if( iFree
ed70: 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69  Blk && iEnd+3>=i
ed80: 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20  FreeBlk ){.     
ed90: 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c   nFrag = iFreeBl
eda0: 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20  k - iEnd;.      
edb0: 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c  if( iEnd>iFreeBl
edc0: 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  k ) return SQLIT
edd0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
ede0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 45 6e  Page);.      iEn
edf0: 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67  d = iFreeBlk + g
ee00: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
ee10: 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20  reeBlk+2]);.    
ee20: 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61    if( iEnd > pPa
ee30: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ee40: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
ee50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ee60: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
ee70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ee80: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
ee90: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72  Start;.      iFr
eea0: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
eeb0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d  (&data[iFreeBlk]
eec0: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
eed0: 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e  /* If iPtr is an
eee0: 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20  other freeblock 
eef0: 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74  (that is, if iPt
ef00: 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65  r is not the fre
ef10: 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69  elist.    ** poi
ef20: 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
ef30: 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68   header) then ch
ef40: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53  eck to see if iS
ef50: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20  tart should be. 
ef60: 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20     ** coalesced 
ef70: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
ef80: 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iPtr..    */.   
ef90: 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20   if( iPtr>hdr+1 
efa0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74  ){.      int iPt
efb0: 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65  rEnd = iPtr + ge
efc0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
efd0: 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  r+2]);.      if(
efe0: 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61   iPtrEnd+3>=iSta
eff0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rt ){.        if
f000: 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74  ( iPtrEnd>iStart
f010: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
f020: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
f030: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 46  age);.        nF
f040: 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20  rag += iStart - 
f050: 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20  iPtrEnd;.       
f060: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
f070: 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53  iPtr;.        iS
f080: 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20  tart = iPtr;.   
f090: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f0a0: 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64  f( nFrag>data[hd
f0b0: 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51  r+7] ) return SQ
f0c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
f0d0: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64 61  E(pPage);.    da
f0e0: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72  ta[hdr+7] -= nFr
f0f0: 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67 65  ag;.  }.  x = ge
f100: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
f110: 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74 61  +5]);.  if( iSta
f120: 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a 20  rt<=x ){.    /* 
f130: 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  The new freebloc
f140: 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69  k is at the begi
f150: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c  nning of the cel
f160: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a  l content area,.
f170: 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65      ** so just e
f180: 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  xtend the cell c
f190: 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68  ontent area rath
f1a0: 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61  er than create a
f1b0: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72  nother.    ** fr
f1c0: 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a  eelist entry */.
f1d0: 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3c 78      if( iStart<x
f1e0: 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31 20   || iPtr!=hdr+1 
f1f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f200: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
f210: 67 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ge);.    put2byt
f220: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  e(&data[hdr+1], 
f230: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
f240: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
f250: 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d  r+5], iEnd);.  }
f260: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73  else{.    /* Ins
f270: 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65  ert the new free
f280: 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66  block into the f
f290: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70  reelist */.    p
f2a0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  ut2byte(&data[iP
f2b0: 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  tr], iStart);.  
f2c0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  }.  if( pPage->p
f2d0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
f2e0: 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29  TS_FAST_SECURE )
f2f0: 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69  {.    /* Overwri
f300: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
f310: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
f320: 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72  s when the secur
f330: 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20  e_delete.    ** 
f340: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
f350: 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
f360: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30  &data[iStart], 0
f370: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
f380: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
f390: 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b  Start], iFreeBlk
f3a0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
f3b0: 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69  ata[iStart+2], i
f3c0: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
f3d0: 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69  nFree += iOrigSi
f3e0: 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ze;.  return SQL
f3f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f400: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
f410: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
f420: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
f430: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
f440: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
f450: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
f460: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
f470: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
f480: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
f490: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
f4a0: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
f4b0: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
f4c0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
f4d0: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
f4e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
f4f0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
f500: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
f510: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
f520: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
f530: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
f540: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
f550: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
f560: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
f570: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
f580: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
f590: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
f5a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
f5b0: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
f5c0: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
f5d0: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
f5e0: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
f5f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
f600: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
f610: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
f620: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
f630: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f640: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
f650: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
f660: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
f670: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
f680: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
f690: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
f6a0: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
f6b0: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
f6c0: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
f6d0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50  Page->leaf;.  pP
f6e0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
f6f0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20   cellSizePtr;.  
f700: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
f710: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
f720: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
f730: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
f740: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f750: 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33  -OF: R-07291-353
f760: 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20  28 A value of 5 
f770: 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65  (0x05) means the
f780: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
f790: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c  ** interior tabl
f7a0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
f7b0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f7c0: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
f7d0: 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20  INTKEY)==5 );.  
f7e0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f7f0: 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20  : R-26900-09176 
f800: 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30  A value of 13 (0
f810: 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70  x0d) means the p
f820: 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20  age is a.    ** 
f830: 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65  leaf table b-tre
f840: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
f850: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
f860: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c  DATA|PTF_INTKEY|
f870: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b  PTF_LEAF)==13 );
f880: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
f890: 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ey = 1;.    if( 
f8a0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
f8b0: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
f8c0: 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20  eyLeaf = 1;.    
f8d0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
f8e0: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
f8f0: 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c  CellPtr;.    }el
f900: 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  se{.      pPage-
f910: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b  >intKeyLeaf = 0;
f920: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43  .      pPage->xC
f930: 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69  ellSize = cellSi
f940: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  zePtrNoPayload;.
f950: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
f960: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
f970: 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79  arseCellPtrNoPay
f980: 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  load;.    }.    
f990: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
f9a0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
f9b0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
f9c0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
f9d0: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
f9e0: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
f9f0: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a  RODATA ){.    /*
fa00: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fa10: 34 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61  43316-37308 A va
fa20: 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20  lue of 2 (0x02) 
fa30: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
fa40: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65  s an.    ** inte
fa50: 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65  rior index b-tre
fa60: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
fa70: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
fa80: 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20  DATA)==2 );.    
fa90: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
faa0: 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20  R-59615-42828 A 
fab0: 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30  value of 10 (0x0
fac0: 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  a) means the pag
fad0: 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65  e is a.    ** le
fae0: 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  af index b-tree 
faf0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
fb00: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
fb10: 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30  TA|PTF_LEAF)==10
fb20: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
fb30: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
fb40: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
fb50: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
fb60: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
fb70: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
fb80: 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d  ndex;.    pPage-
fb90: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
fba0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
fbb0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
fbc0: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
fbd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
fbe0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
fbf0: 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f  7608-56469 Any o
fc00: 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  ther value for t
fc10: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
fc20: 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e  ype is.    ** an
fc30: 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72   error. */.    r
fc40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fc50: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
fc60: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
fc70: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
fc80: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
fc90: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
fca0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fcb0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
fcc0: 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 73 70  amount of freesp
fcd0: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ace on the page.
fce0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
fcf0: 2c 20 66 69 6c 6c 0a 2a 2a 20 69 6e 20 74 68 65  , fill.** in the
fd00: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 66 69   pPage->nFree fi
fd10: 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eld..*/.static i
fd20: 6e 74 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46  nt btreeComputeF
fd30: 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  reeSpace(MemPage
fd40: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
fd50: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
fd60: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
fd70: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
fd80: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
fd90: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
fda0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
fdb0: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
fdc0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
fdd0: 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
fde0: 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f       /* Equal to
fdf0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
fe00: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
fe10: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
fe20: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
fe30: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
fe40: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
fe50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
fe60: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
fe70: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
fe80: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
fe90: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
fea0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
feb0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
fec0: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
fed0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
fee0: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
fef0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
ff00: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74  .  int iCellLast
ff10: 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f  ;     /* Last po
ff20: 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  ssible cell or f
ff30: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
ff40: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
ff50: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
ff60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ff70: 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  pBt->db!=0 );.  
ff80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
ff90: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
ffa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
ffb0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ffc0: 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ->pgno==sqlite3P
ffd0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
ffe0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10000 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e == sqlite3Page
10010 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
10020 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
10030 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
10040 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  ata == sqlite3Pa
10050 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
10060 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
10070 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
10080 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 61 73  sInit==1 );.  as
10090 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
100a0 65 65 3c 30 20 29 3b 0a 0a 20 20 75 73 61 62 6c  ee<0 );..  usabl
100b0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
100c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
100d0 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
100e0 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  drOffset;.  data
100f0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
10100 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
10110 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35  F: R-58015-48175
10120 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
10130 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
10140 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a  5 designates.  *
10150 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
10160 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
10170 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c  area. A zero val
10180 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65  ue for this inte
10190 67 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65  ger is.  ** inte
101a0 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36  rpreted as 65536
101b0 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
101c0 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
101d0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 43  ta[hdr+5]);.  iC
101e0 65 6c 6c 46 69 72 73 74 20 3d 20 68 64 72 20 2b  ellFirst = hdr +
101f0 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c   8 + pPage->chil
10200 64 50 74 72 53 69 7a 65 20 2b 20 32 2a 70 50 61  dPtrSize + 2*pPa
10210 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  ge->nCell;.  iCe
10220 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
10230 69 7a 65 20 2d 20 34 3b 0a 0a 20 20 2f 2a 20 43  ize - 4;..  /* C
10240 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
10250 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74   free space on t
10260 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56 49  he page.  ** EVI
10270 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38  DENCE-OF: R-2358
10280 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d  8-34450 The two-
10290 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
102a0 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74  offset 1 gives t
102b0 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  he.  ** start of
102c0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62   the first freeb
102d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
102e0 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20  , or is zero if 
102f0 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
10300 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
10310 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
10320 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
10330 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
10340 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a  dr+7] + top;  /*
10350 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e   Init nFree to n
10360 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65  on-freeblock fre
10370 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66 28  e space */.  if(
10380 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33 32   pc>0 ){.    u32
10390 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
103a0 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
103b0 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45  st ){.      /* E
103c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
103d0 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77  530-52930 In a w
103e0 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65  ell-formed b-tre
103f0 65 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69  e page, there wi
10400 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  ll.      ** alwa
10410 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ys be at least o
10420 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74  ne cell before t
10430 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
10440 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
10450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10460 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
10470 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20  age); .    }.   
10480 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
10490 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c     if( pc>iCellL
104a0 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
104b0 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20  * Freeblock off 
104c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
104d0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  age */.        r
104e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
104f0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10510 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
10520 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
10530 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
10540 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
10550 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46        nFree = nF
10560 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20  ree + size;.    
10570 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73    if( next<=pc+s
10580 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20  ize+3 ) break;. 
10590 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a       pc = next;.
105a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 65      }.    if( ne
105b0 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  xt>0 ){.      /*
105c0 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69   Freeblock not i
105d0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
105e0 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
105f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10600 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
10610 20 20 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73    }.    if( pc+s
10620 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e  ize>(unsigned in
10630 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  t)usableSize ){.
10640 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72        /* Last fr
10650 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20  eeblock extends 
10660 70 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f  past page end */
10670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10680 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10690 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
106a0 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
106b0 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
106c0 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
106d0 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
106e0 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
106f0 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
10700 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68  ent area plus th
10710 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
10720 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20   bytes within.  
10730 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
10740 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
10750 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
10760 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
10770 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61  e.  ** of the pa
10780 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
10790 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
107a0 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
107b0 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73  also.  ** serves
107c0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
107d0 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
107e0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
107f0 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  ell-content.  **
10800 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67   area, according
10810 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
10820 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e  der, lies within
10830 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a   the page..  */.
10840 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62    if( nFree>usab
10850 6c 65 53 69 7a 65 20 7c 7c 20 6e 46 72 65 65 3c  leSize || nFree<
10860 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20  iCellFirst ){.  
10870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10880 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10890 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ge);.  }.  pPage
108a0 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
108b0 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72  nFree - iCellFir
108c0 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  st);.  return SQ
108d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
108e0 2a 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  * Do additional 
108f0 73 61 6e 69 74 79 20 63 68 65 63 6b 20 61 66 74  sanity check aft
10900 65 72 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  er btreeInitPage
10910 28 29 20 69 66 0a 2a 2a 20 50 52 41 47 4d 41 20  () if.** PRAGMA 
10920 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d  cell_size_check=
10930 4f 4e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ON .*/.static SQ
10940 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
10950 74 20 62 74 72 65 65 43 65 6c 6c 53 69 7a 65 43  t btreeCellSizeC
10960 68 65 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  heck(MemPage *pP
10970 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 43 65 6c  age){.  int iCel
10980 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
10990 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
109a0 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
109b0 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  offset */.  int 
109c0 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
109d0 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
109e0 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
109f0 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  k offset */.  in
10a00 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10a10 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
10a20 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
10a30 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 73  array */.  int s
10a40 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  z;            /*
10a50 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
10a60 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
10a70 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10a80 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
10a90 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
10aa0 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20  aData[] */.  u8 
10ab0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
10ac0 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
10ad0 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
10ae0 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
10af0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 73 61 62   /* Maximum usab
10b00 6c 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  le space on the 
10b10 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
10b20 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
10b30 53 74 61 72 74 20 6f 66 20 63 65 6c 6c 20 63 6f  Start of cell co
10b40 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20  ntent area */.. 
10b50 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 70 50   iCellFirst = pP
10b60 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
10b70 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
10b80 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
10b90 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
10ba0 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c  bleSize;.  iCell
10bb0 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
10bc0 65 20 2d 20 34 3b 0a 20 20 64 61 74 61 20 3d 20  e - 4;.  data = 
10bd0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
10be0 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
10bf0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
10c00 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
10c10 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
10c20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10c30 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
10c40 29 7b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  ){.    pc = get2
10c50 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74  byteAligned(&dat
10c60 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
10c70 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ]);.    testcase
10c80 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
10c90 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
10ca0 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
10cb0 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  );.    if( pc<iC
10cc0 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
10cd0 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
10ce0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10cf0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10d00 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ge);.    }.    s
10d10 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  z = pPage->xCell
10d20 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74  Size(pPage, &dat
10d30 61 5b 70 63 5d 29 3b 0a 20 20 20 20 74 65 73 74  a[pc]);.    test
10d40 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
10d50 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 69  bleSize );.    i
10d60 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53  f( pc+sz>usableS
10d70 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
10d80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10d90 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10da0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
10db0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10dc0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
10dd0 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
10de0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
10df0 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
10e00 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
10e10 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
10e20 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
10e30 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
10e40 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
10e50 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
10e60 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
10e70 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
10e80 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
10e90 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
10ea0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
10eb0 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
10ec0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
10ed0 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
10ee0 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
10ef0 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
10f00 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
10f10 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
10f20 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
10f30 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
10f40 70 50 61 67 65 29 7b 0a 20 20 75 38 20 2a 64 61  pPage){.  u8 *da
10f50 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
10f60 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
10f70 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61  aData */.  BtSha
10f80 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
10f90 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
10fa0 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
10fb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10fc0 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
10fd0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
10fe0 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
10ff0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11000 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
11010 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11020 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11030 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
11040 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
11050 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
11060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d   assert( pPage =
11070 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
11080 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
11090 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
110a0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
110b0 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
110c0 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
110d0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
110e0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
110f0 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20  it==0 );..  pBt 
11100 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
11110 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
11120 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 68 64 72  ata + pPage->hdr
11130 4f 66 66 73 65 74 3b 0a 20 20 2f 2a 20 45 56 49  Offset;.  /* EVI
11140 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39  DENCE-OF: R-2859
11150 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d  4-02890 The one-
11160 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66  byte flag at off
11170 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67  set 0 indicating
11180 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65  .  ** the b-tree
11190 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20   page type. */. 
111a0 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
111b0 28 70 50 61 67 65 2c 20 64 61 74 61 5b 30 5d 29  (pPage, data[0])
111c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
111d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
111e0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
111f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
11200 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
11210 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
11220 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
11230 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
11240 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
11250 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f   1);.  pPage->nO
11260 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70  verflow = 0;.  p
11270 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
11280 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
11290 73 65 74 20 2b 20 38 20 2b 20 70 50 61 67 65 2d  set + 8 + pPage-
112a0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
112b0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
112c0 20 3d 20 64 61 74 61 20 2b 20 70 50 61 67 65 2d   = data + pPage-
112d0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2b 20  >childPtrSize + 
112e0 38 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  8;.  pPage->aDat
112f0 61 45 6e 64 20 3d 20 70 50 61 67 65 2d 3e 61 44  aEnd = pPage->aD
11300 61 74 61 20 2b 20 70 42 74 2d 3e 75 73 61 62 6c  ata + pBt->usabl
11310 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
11320 61 44 61 74 61 4f 66 73 74 20 3d 20 70 50 61 67  aDataOfst = pPag
11330 65 2d 3e 61 44 61 74 61 20 2b 20 70 50 61 67 65  e->aData + pPage
11340 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
11350 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
11360 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20  : R-37002-32774 
11370 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
11380 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
11390 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20   gives the.  ** 
113a0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
113b0 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  on the page. */.
113c0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
113d0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
113e0 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  3]);.  if( pPage
113f0 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
11400 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
11410 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
11420 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
11430 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
11440 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
11450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11460 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
11470 65 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61  e);.  }.  testca
11480 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
11490 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
114a0 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
114b0 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37  OF: R-24089-5797
114c0 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74  9 If a page cont
114d0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77  ains no cells (w
114e0 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a  hich is only.  *
114f0 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  * possible for a
11500 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
11510 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61  table that conta
11520 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65  ins no rows) the
11530 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65  n the.  ** offse
11540 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
11550 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20  ntent area will 
11560 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73  equal the page s
11570 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20  ize minus the.  
11580 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
11590 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
115a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
115b0 6e 43 65 6c 6c 3e 30 0a 20 20 20 20 20 20 20 7c  nCell>0.       |
115c0 7c 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  | get2byteNotZer
115d0 6f 28 26 64 61 74 61 5b 35 5d 29 3d 3d 28 69 6e  o(&data[5])==(in
115e0 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
115f0 65 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  e.       || CORR
11600 55 50 54 5f 44 42 20 29 3b 0a 20 20 70 50 61 67  UPT_DB );.  pPag
11610 65 2d 3e 6e 46 72 65 65 20 3d 20 2d 31 3b 20 20  e->nFree = -1;  
11620 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  /* Indicate that
11630 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 79   this value is y
11640 65 74 20 75 6e 63 6f 6d 70 75 74 65 64 20 2a 2f  et uncomputed */
11650 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
11660 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 42 74 2d   = 1;.  if( pBt-
11670 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
11680 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29  ITE_CellSizeCk )
11690 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
116a0 65 65 43 65 6c 6c 53 69 7a 65 43 68 65 63 6b 28  eeCellSizeCheck(
116b0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
116c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
116d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
116e0 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
116f0 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
11700 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
11710 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
11720 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
11730 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
11740 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
11750 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
11760 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
11770 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
11780 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
11790 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
117a0 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
117b0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
117c0 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
117d0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
117e0 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
117f0 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
11800 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
11810 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11820 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
11830 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
11840 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
11850 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11860 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
11870 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
11880 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
11890 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
118a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
118b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
118c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
118d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
118e0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
118f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
11900 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b  S_FAST_SECURE ){
11910 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
11920 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
11930 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
11940 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
11950 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
11960 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
11970 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
11980 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
11990 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
119a0 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
119b0 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
119c0 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
119d0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
119e0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
119f0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
11a00 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
11a10 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
11a20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
11a30 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
11a40 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
11a50 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
11a60 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
11a70 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
11a80 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
11a90 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
11aa0 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
11ab0 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
11ac0 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
11ad0 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
11ae0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
11af0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
11b00 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
11b10 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
11b20 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
11b30 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
11b40 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
11b50 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
11b60 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
11b70 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
11b80 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
11b90 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
11ba0 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
11bb0 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
11bc0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
11bd0 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
11be0 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
11bf0 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
11c00 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
11c10 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
11c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
11c30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
11c40 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
11c50 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11c60 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
11c70 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70  ( pgno!=pPage->p
11c80 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
11c90 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
11ca0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
11cb0 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67  bPage);.    pPag
11cc0 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
11cd0 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Page;.    pPage-
11ce0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
11cf0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
11d00 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68  no;.    pPage->h
11d10 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
11d20 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
11d30 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
11d40 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  e->aData==sqlite
11d50 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
11d60 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
11d70 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
11d80 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
11d90 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
11da0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
11db0 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
11dc0 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
11dd0 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
11de0 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62  ed.  See also: b
11df0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
11e00 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
11e10 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  e PAGER_GET_NOCO
11e20 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65  NTENT flag is se
11e30 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
11e40 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   we do not care.
11e50 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  ** about the con
11e60 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
11e70 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
11e80 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
11e90 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
11ea0 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
11eb0 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
11ec0 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
11ed0 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
11ee0 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
11ef0 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
11f00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
11f10 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
11f20 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
11f30 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
11f40 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
11f50 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
11f60 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
11f70 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
11f80 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
11f90 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
11fa0 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
11fb0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
11fc0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
11fd0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
11fe0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11ff0 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
12000 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
12010 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
12020 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
12030 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
12040 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
12050 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
12060 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
12070 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
12080 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
12090 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
120a0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
120b0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
120c0 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
120d0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c  _GET_NOCONTENT |
120e0 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
120f0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20  ET_READONLY );. 
12100 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12110 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12120 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
12130 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
12140 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
12150 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
12160 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
12170 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
12180 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
12190 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
121a0 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
121b0 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
121c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
121d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
121e0 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
121f0 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
12200 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
12210 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
12220 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
12230 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
12240 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
12250 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
12260 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
12270 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
12280 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
12290 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
122a0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
122b0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
122c0 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
122d0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
122e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
122f0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
12300 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
12310 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
12320 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
12330 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
12340 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
12350 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
12360 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
12370 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
12380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
12390 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
123a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
123b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
123c0 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
123d0 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
123e0 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
123f0 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
12400 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
12410 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
12420 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
12430 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
12440 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
12450 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
12460 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
12470 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
12480 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
12490 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
124a0 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
124b0 30 78 38 30 30 30 30 30 30 30 29 3d 3d 30 20 29  0x80000000)==0 )
124c0 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
124d0 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
124e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
124f0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
12500 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
12510 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  lize it..**.** I
12520 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74  f pCur!=0 then t
12530 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
12540 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74   fetched as part
12550 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   of a moveToChil
12560 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f  d().** call.  Do
12570 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
12580 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
12590 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
125a0 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20  case..** And if 
125b0 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c  the fetch fails,
125c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   this routine mu
125d0 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75  st decrement pCu
125e0 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  r->iPage..**.** 
125f0 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63  The page is fetc
12600 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74  hed as read-writ
12610 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73  e unless pCur is
12620 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73   not NULL and is
12630 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  .** a read-only 
12640 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
12650 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12660 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
12670 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
12680 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
12690 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
126a0 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
126b0 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
126c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
126d0 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
126e0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12700 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
12710 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
12720 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
12730 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12740 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
12750 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
12760 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
12770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
12780 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
12790 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42  nter here */.  B
127a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
127c0 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65  * Cursor to rece
127d0 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72  ive the page, or
127e0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62   NULL */.  int b
127f0 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20  ReadOnly        
12800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
12810 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
12820 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ly page */.){.  
12830 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
12840 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
12850 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12860 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
12870 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12880 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61   pCur==0 || ppPa
12890 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50 61 67 65  ge==&pCur->pPage
128a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
128b0 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
128c0 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
128d0 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
128e0 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
128f0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
12900 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
12910 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
12920 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12930 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12940 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
12950 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 31  dInitPage_error1
12960 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
12970 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
12980 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
12990 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
129a0 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a  ge, bReadOnly);.
129b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
129c0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
129d0 61 67 65 5f 65 72 72 6f 72 31 3b 0a 20 20 7d 0a  age_error1;.  }.
129e0 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d    *ppPage = (Mem
129f0 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
12a00 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
12a10 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50  ge);.  if( (*ppP
12a20 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
12a30 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67 65  ){.    btreePage
12a40 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
12a50 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
12a60 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
12a70 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  itPage(*ppPage);
12a80 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12a90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12aa0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
12ab0 61 67 65 5f 65 72 72 6f 72 32 3b 0a 20 20 20 20  age_error2;.    
12ac0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
12ad0 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
12ae0 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
12af0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44  t( (*ppPage)->aD
12b00 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
12b10 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
12b20 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62  ) );..  /* If ob
12b30 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20  taining a child 
12b40 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f  page for a curso
12b50 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69 66  r, we must verif
12b60 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
12b70 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62  is.  ** compatib
12b80 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74  le with the root
12b90 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20   page. */.  if( 
12ba0 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61 67  pCur && ((*ppPag
12bb0 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28  e)->nCell<1 || (
12bc0 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79  *ppPage)->intKey
12bd0 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  !=pCur->curIntKe
12be0 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  y) ){.    rc = S
12bf0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
12c00 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20 67 6f  NO(pgno);.    go
12c10 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
12c20 65 5f 65 72 72 6f 72 32 3b 0a 20 20 7d 0a 20 20  e_error2;.  }.  
12c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12c40 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67  ;..getAndInitPag
12c50 65 5f 65 72 72 6f 72 32 3a 0a 20 20 72 65 6c 65  e_error2:.  rele
12c60 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
12c70 3b 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  ;.getAndInitPage
12c80 5f 65 72 72 6f 72 31 3a 0a 20 20 69 66 28 20 70  _error1:.  if( p
12c90 43 75 72 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  Cur ){.    pCur-
12ca0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43  >iPage--;.    pC
12cb0 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72  ur->pPage = pCur
12cc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
12cd0 50 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73  Page];.  }.  tes
12ce0 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29  tcase( pgno==0 )
12cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
12d00 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
12d10 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72  E_CORRUPT );.  r
12d20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12d30 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
12d40 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
12d50 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
12d60 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
12d70 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
12d80 65 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  eGetPage..**.** 
12d90 50 61 67 65 31 20 69 73 20 61 20 73 70 65 63 69  Page1 is a speci
12da0 61 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73 74  al case and must
12db0 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 73 69   be released usi
12dc0 6e 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e  ng releasePageOn
12dd0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
12de0 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e  oid releasePageN
12df0 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  otNull(MemPage *
12e00 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  pPage){.  assert
12e10 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
12e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12e30 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
12e40 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
12e50 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
12e60 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
12e70 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
12e80 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
12e90 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
12ea0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12eb0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
12ec0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
12ed0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
12ee0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12ef0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
12f00 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
12f10 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
12f20 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70  NotNull(pPage->p
12f30 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69  DbPage);.}.stati
12f40 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
12f50 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
12f60 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
12f70 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  ) releasePageNot
12f80 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73  Null(pPage);.}.s
12f90 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
12fa0 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67  sePageOne(MemPag
12fb0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73  e *pPage){.  ass
12fc0 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b  ert( pPage!=0 );
12fd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12fe0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
12ff0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
13000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13010 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
13020 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13030 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
13040 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
13050 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
13060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13070 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
13080 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
13090 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
130a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
130b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
130c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
130d0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  x) );.  sqlite3P
130e0 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65  agerUnrefPageOne
130f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
13100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
13110 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a  n unused page..*
13120 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
13130 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47  just like btreeG
13140 65 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68  etPage() with th
13150 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a  e addition:.**.*
13160 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61  *   *  If the pa
13170 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
13180 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74   use for some ot
13190 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d  her purpose, imm
131a0 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  ediately.**     
131b0 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20   release it and 
131c0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
131d0 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a  _CURRUPT error..
131e0 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72  **   *  Make sur
131f0 65 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61  e the isInit fla
13200 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74  g is clear.*/.st
13210 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
13220 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42  tUnusedPage(.  B
13230 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
13240 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
13250 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
13260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13270 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
13280 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
13290 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
132a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
132b0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
132c0 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
132d0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
132e0 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
132f0 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
13300 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
13310 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
13320 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
13330 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
13340 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
13350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13360 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
13370 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
13380 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
13390 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
133a0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
133b0 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
133c0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
133d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
133e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
133f0 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
13400 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65  isInit = 0;.  }e
13410 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
13420 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
13430 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
13440 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
13450 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
13460 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
13470 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
13480 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
13490 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
134a0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
134b0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
134c0 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
134d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
134e0 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
134f0 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
13500 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
13510 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13520 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
13530 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
13540 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
13550 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
13560 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
13570 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
13580 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
13590 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
135a0 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
135b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
135c0 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
135d0 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
135e0 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
135f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13600 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
13610 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
13620 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
13630 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
13640 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13650 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
13660 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
13670 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
13680 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
13690 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
136a0 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
136b0 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
136c0 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
136d0 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
136e0 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
136f0 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
13700 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
13710 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
13720 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
13730 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
13740 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
13750 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
13760 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74   will likely ret
13770 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
13780 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74  PT..      ** But
13790 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65   no harm is done
137a0 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69   by this.  And i
137b0 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74  t is very import
137c0 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ant that.      *
137d0 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
137e0 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
137f0 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
13800 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
13810 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
13820 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
13830 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
13840 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
13850 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
13860 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
13870 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
13880 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
13890 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
138a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
138b0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
138c0 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
138d0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
138e0 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
138f0 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
13900 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
13910 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13920 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
13930 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
13940 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
13950 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
13960 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
13970 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
139a0 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
139b0 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  er));.}../*.** O
139c0 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66  pen a database f
139d0 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c  ile..** .** zFil
139e0 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  ename is the nam
139f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
13a00 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c  e file.  If zFil
13a10 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a  ename is NULL.**
13a20 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72   then an ephemer
13a30 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63  al database is c
13a40 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68  reated.  The eph
13a50 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
13a60 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c  might.** be excl
13a70 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72  usively in memor
13a80 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75  y, or it might u
13a90 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20  se a disk-based 
13aa0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a  memory cache..**
13ab0 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
13ac0 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
13ad0 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f  ase will be auto
13ae0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
13af0 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74  d .** when sqlit
13b00 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
13b10 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
13b20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
13b30 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
13b40 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
13b50 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
13b60 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
13b70 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
13b80 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
13b90 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
13ba0 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74   "flags" paramet
13bb0 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
13bc0 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61  that might conta
13bd0 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20  in bits like.** 
13be0 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  BTREE_OMIT_JOURN
13bf0 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f  AL and/or BTREE_
13c00 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  MEMORY..**.** If
13c10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
13c20 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
13c30 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
13c40 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
13c50 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e  ** and we are in
13c60 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f   shared cache mo
13c70 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65  de, then the ope
13c80 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  n will fail with
13c90 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f   an.** SQLITE_CO
13ca0 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20  NSTRAINT error. 
13cb0 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   We cannot allow
13cc0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53   two or more BtS
13cd0 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73  hared.** objects
13ce0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
13cf0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13d00 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
13d10 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20  will lead.** to 
13d20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f  problems with lo
13d30 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
13d40 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
13d50 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
13d60 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53  Vfs,      /* VFS
13d70 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
13d80 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e   b-tree */.  con
13d90 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
13da0 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
13db0 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
13dc0 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
13dd0 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
13de0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
13df0 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
13e00 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
13e10 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
13e20 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f  pBtree,        /
13e30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
13e40 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
13e50 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
13e60 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
13e70 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
13e80 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  ns */.  int vfsF
13e90 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
13ea0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
13eb0 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
13ec0 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
13ed0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
13ee0 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20  *pBt = 0;       
13ef0 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
13f00 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74  part of btree st
13f10 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72  ructure */.  Btr
13f20 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ee *p;          
13f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
13f40 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
13f50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
13f60 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20  ex *mutexOpen = 
13f70 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20  0;  /* Prevents 
13f80 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
13f90 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a  . Ticket #3537 *
13fa0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
13fb0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
13fc0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
13fd0 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  e from this func
13fe0 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65  tion */.  u8 nRe
13ff0 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
14000 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
14010 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
14020 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
14030 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
14040 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
14050 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65    /* Database he
14060 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ader content */.
14070 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70  .  /* True if op
14080 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ening an ephemer
14090 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61  al, temporary da
140a0 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
140b0 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d  t int isTempDb =
140c0 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
140d0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30   zFilename[0]==0
140e0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
140f0 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62  variable isMemdb
14100 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20   to true for an 
14110 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
14120 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c  se, or .  ** fal
14130 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61  se for a file-ba
14140 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  sed database..  
14150 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14160 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
14170 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
14180 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20  db = 0;.#else.  
14190 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
141a0 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26  b = (zFilename &
141b0 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  & strcmp(zFilena
141c0 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  me, ":memory:")=
141d0 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
141e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69             || (i
141f0 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74  sTempDb && sqlit
14200 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64  e3TempInMemory(d
14210 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  b)).            
14220 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76             || (v
14230 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
14240 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30  _OPEN_MEMORY)!=0
14250 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
14260 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
14270 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29  ssert( pVfs!=0 )
14280 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
14290 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
142a0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
142b0 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78  ssert( (flags&0x
142c0 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20  ff)==flags );   
142d0 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20  /* flags fit in 
142e0 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  8 bits */..  /* 
142f0 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e  Only a BTREE_SIN
14300 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e  GLE database can
14310 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45   be BTREE_UNORDE
14320 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  RED */.  assert(
14330 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
14340 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c  UNORDERED)==0 ||
14350 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
14360 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20  SINGLE)!=0 );.. 
14370 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47   /* A BTREE_SING
14380 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61  LE database is a
14390 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72  lways a temporar
143a0 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72  y and/or ephemer
143b0 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  al */.  assert( 
143c0 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
143d0 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54  INGLE)==0 || isT
143e0 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  empDb );..  if( 
143f0 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66  isMemdb ){.    f
14400 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45  lags |= BTREE_ME
14410 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MORY;.  }.  if( 
14420 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
14430 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
14440 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20  !=0 && (isMemdb 
14450 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a  || isTempDb) ){.
14460 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28      vfsFlags = (
14470 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49  vfsFlags & ~SQLI
14480 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
14490 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54   | SQLITE_OPEN_T
144a0 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20  EMP_DB;.  }.  p 
144b0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
144c0 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65  ero(sizeof(Btree
144d0 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  ));.  if( !p ){.
144e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
144f0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
14500 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
14510 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
14520 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
14530 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
14540 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
14550 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
14560 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
14570 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
14580 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
14590 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
145a0 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
145b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
145c0 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
145d0 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
145e0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
145f0 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
14600 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
14610 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
14620 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
14630 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
14640 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
14650 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69  sTempDb==0 && (i
14660 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66  sMemdb==0 || (vf
14670 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
14680 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20  EN_URI)!=0) ){. 
14690 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20     if( vfsFlags 
146a0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
146b0 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20  AREDCACHE ){.   
146c0 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
146d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
146e0 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b  30(zFilename)+1;
146f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c  .      int nFull
14700 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
14710 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
14720 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c       char *zFull
14730 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
14740 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75  e3Malloc(MAX(nFu
14750 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65  llPathname,nFile
14760 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55  name));.      MU
14770 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
14780 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
14790 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20  hared; )..      
147a0 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
147b0 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
147c0 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
147d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
147e0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
147f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
14800 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  M_BKPT;.      }.
14810 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64        if( isMemd
14820 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
14830 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
14840 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  e, zFilename, nF
14850 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
14860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
14870 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
14880 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
14890 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46                nF
148c0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
148d0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
148e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
148f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14900 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
14910 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
14920 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
14930 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
14940 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
14950 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49        }.#if SQLI
14960 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
14970 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
14980 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
14990 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
149a0 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
149b0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
149c0 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
149d0 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
149e0 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
149f0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14a00 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14a10 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
14a20 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14a30 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65  mutexShared);.#e
14a40 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70  ndif.      for(p
14a50 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
14a60 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
14a70 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
14a80 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
14a90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
14aa0 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
14ab0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
14ac0 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
14ad0 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
14ae0 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
14af0 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20  >pPager, 0)).   
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
14b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
14b20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70  (pBt->pPager)==p
14b30 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Vfs ){.         
14b40 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
14b50 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e      for(iDb=db->
14b60 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69  nDb-1; iDb>=0; i
14b70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20  Db--){.         
14b80 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74     Btree *pExist
14b90 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ing = db->aDb[iD
14ba0 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20  b].pBt;.        
14bb0 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e      if( pExistin
14bc0 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e  g && pExisting->
14bd0 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  pBt==pBt ){.    
14be0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14bf0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
14c00 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
14c10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14c20 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
14c30 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
14c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14c50 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
14c60 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
14c70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14c80 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
14c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ca0 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
14cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14cd0 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
14ce0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
14cf0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
14d00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
14d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
14d20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14d30 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
14d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14d50 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
14d60 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
14d70 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
14d80 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
14d90 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
14da0 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
14db0 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
14dc0 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
14dd0 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
14de0 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
14df0 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
14e00 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
14e10 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
14e20 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
14e30 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
14e40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14e50 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
14e60 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
14e70 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
14e80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14e90 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
14ea0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
14eb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
14ec0 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
14ed0 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
14ee0 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
14ef0 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
14f00 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
14f10 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
14f20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
14f30 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
14f40 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
14f50 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
14f60 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
14f70 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
14f80 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
14f90 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
14fa0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
14fb0 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a  zeof(i64)==8 );.
14fc0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14fd0 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(u64)==8 );.  
14fe0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14ff0 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u32)==4 );.    
15000 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
15010 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73  16)==2 );.    as
15020 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e  sert( sizeof(Pgn
15030 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20  o)==4 );.  .    
15040 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  pBt = sqlite3Mal
15050 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
15060 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  *pBt) );.    if(
15070 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pBt==0 ){.     
15080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
15090 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
150a0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
150b0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
150c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
150d0 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
150e0 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
150f0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
15110 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c  eof(MemPage), fl
15120 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70  ags, vfsFlags, p
15130 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20  ageReinit);.    
15140 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15150 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
15160 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
15170 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
15180 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20   db->szMmap);.  
15190 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
151a0 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
151b0 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
151c0 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
151d0 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
151e0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
151f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15200 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
15210 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
15220 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73    pBt->openFlags
15230 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20   = (u8)flags;.  
15240 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
15250 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15260 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 70  SetBusyHandler(p
15270 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
15280 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
15290 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
152a0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
152b0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
152c0 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
152d0 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66  age1 = 0;.    if
152e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
152f0 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
15300 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73  ager) ) pBt->bts
15310 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
15320 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69  D_ONLY;.#if defi
15330 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52  ned(SQLITE_SECUR
15340 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42  E_DELETE).    pB
15350 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15360 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
15370 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
15380 53 51 4c 49 54 45 5f 46 41 53 54 5f 53 45 43 55  SQLITE_FAST_SECU
15390 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70  RE_DELETE).    p
153a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
153b0 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23  BTS_OVERWRITE;.#
153c0 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49  endif.    /* EVI
153d0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
153e0 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
153f0 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
15400 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
15410 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
15420 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
15430 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
15440 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
15450 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
15460 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
15470 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
15480 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74  file. */.    pBt
15490 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
154a0 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
154b0 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
154c0 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
154d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
154e0 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
154f0 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
15500 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
15510 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
15520 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
15530 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
15540 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
15550 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
15560 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
15570 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
15580 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
15590 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
155a0 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
155b0 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
155c0 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
155d0 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
155e0 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
155f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
15600 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
15610 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
15620 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
15630 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
15640 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
15650 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
15660 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
15670 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
15680 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
15690 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
156a0 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
156b0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
156c0 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
156d0 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
156e0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
156f0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
15700 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
15710 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
15720 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
15730 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
15740 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
15750 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
15760 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
15770 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
15780 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
15790 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
157a0 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
157b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
157c0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
157d0 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
157e0 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
157f0 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
15800 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  n is.      ** de
15810 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
15820 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
15830 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
15840 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
15850 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  20.      ** into
15860 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15870 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
15880 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
15890 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
158a0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
158b0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
158c0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
158d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
158e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
158f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
15900 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
15910 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
15920 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
15930 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
15940 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
15950 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
15960 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
15970 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15980 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
15990 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
159a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
159b0 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
159c0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
159d0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
159e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
159f0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
15a00 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
15a10 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
15a20 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
15a30 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
15a40 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
15a50 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
15a60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15a70 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
15a80 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
15a90 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
15aa0 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
15ab0 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
15ac0 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
15ad0 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
15ae0 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
15af0 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20  /.    pBt->nRef 
15b00 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 1;.    if( p->
15b10 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
15b20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
15b30 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
15b40 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
15b50 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
15b60 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
15b70 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15b80 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15b90 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20  TIC_MASTER);).  
15ba0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
15bb0 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
15bc0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15bd0 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
15be0 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
15bf0 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
15c00 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
15c10 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
15c20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
15c30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15c40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
15c50 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
15c60 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
15c70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
15c80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15c90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
15ca0 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
15cb0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
15cc0 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
15cd0 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
15ce0 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
15cf0 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
15d00 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
15d10 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
15d20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
15d30 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
15d40 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
15d50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
15d60 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
15d70 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
15d80 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
15d90 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
15da0 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
15db0 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
15dc0 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
15dd0 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
15de0 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
15df0 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
15e00 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
15e10 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
15e20 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
15e30 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
15e40 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
15e50 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
15e60 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
15e70 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
15e80 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
15e90 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
15ea0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15eb0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
15ec0 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
15ed0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
15ee0 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
15ef0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
15f00 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
15f10 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
15f20 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
15f30 20 20 20 20 20 69 66 28 20 28 75 70 74 72 29 70       if( (uptr)p
15f40 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69 62  ->pBt<(uptr)pSib
15f50 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
15f60 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
15f70 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
15f80 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
15f90 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
15fa0 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
15fb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15fc0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
15fd0 78 74 20 26 26 20 28 75 70 74 72 29 70 53 69 62  xt && (uptr)pSib
15fe0 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70  ->pNext->pBt<(up
15ff0 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  tr)p->pBt ){.   
16000 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
16010 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
16020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16030 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
16040 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
16050 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
16060 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
16070 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
16080 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
16090 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
160a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
160b0 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
160c0 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
160d0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
160e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
160f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
16100 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
16110 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
16120 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16130 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
16140 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
16150 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
16160 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
16170 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
16180 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16190 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
161a0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
161b0 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
161c0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
161d0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a  3_file *pFile;..
161e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
161f0 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
16200 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
16210 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
16220 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
16230 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
16240 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
16250 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
16260 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
16270 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
16280 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
16290 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
162a0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
162b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
162c0 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
162d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
162e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
162f0 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
16300 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
16310 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
16320 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46  );.    }..    pF
16330 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
16340 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
16350 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  er);.    if( pFi
16360 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  le->pMethods ){.
16370 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
16380 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
16390 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  File, SQLITE_FCN
163a0 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26  TL_PDB, (void*)&
163b0 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a  pBt->db);.    }.
163c0 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
163d0 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
163e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
163f0 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
16400 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
16410 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
16420 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73  xOpen);.  }.  as
16430 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
16440 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  _OK || sqlite3Bt
16450 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75  reeConnectionCou
16460 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29  nt(*ppBtree)>0 )
16470 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16480 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
16490 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
164a0 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
164b0 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
164c0 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
164d0 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
164e0 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
164f0 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
16500 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
16510 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
16520 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
16530 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
16540 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
16550 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
16560 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16570 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
16580 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
16590 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
165a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
165b0 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f  D_CACHE.  MUTEX_
165c0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
165d0 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
165e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
165f0 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
16600 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
16610 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16620 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
16630 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c  ex) );.  MUTEX_L
16640 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
16650 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
16660 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
16670 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
16680 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16690 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
166a0 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
166b0 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
166c0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
166d0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
166e0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
166f0 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
16700 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
16710 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
16720 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
16730 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
16740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
16750 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
16760 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
16770 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
16780 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
16790 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
167a0 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
167b0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
167c0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
167d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
167e0 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
167f0 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
16800 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
16810 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
16820 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
16830 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
16840 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
16850 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
16860 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
16870 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
16880 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16890 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
168a0 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
168b0 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
168c0 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
168d0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
168e0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
168f0 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
16900 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
16910 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
16920 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79 74  tes with a 4-byt
16930 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c  e prefix for a l
16940 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69  eft-child.** poi
16950 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
16960 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
16970 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
16980 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
16990 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
169a0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
169b0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
169c0 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
169d0 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  eSize );..    /*
169e0 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73   One of the uses
169f0 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61   of pBt->pTmpSpa
16a00 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20  ce is to format 
16a10 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20  cells before.   
16a20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68   ** inserting th
16a30 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70  em into a leaf p
16a40 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69  age (function fi
16a50 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a  llInCell()). If.
16a60 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73      ** a cell is
16a70 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74   less than 4 byt
16a80 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69  es in size, it i
16a90 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  s rounded up to 
16aa0 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62  4 bytes.    ** b
16ab0 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  y the various ro
16ac0 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69  utines that mani
16ad0 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65  pulate binary ce
16ae0 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a  lls. Which.    *
16af0 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20  * can mean that 
16b00 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
16b10 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  y initializes th
16b20 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20  e first 2 or 3. 
16b30 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
16b40 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68  TmpSpace, but th
16b50 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62  at the first 4 b
16b60 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20  ytes are copied 
16b70 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69  from.    ** it i
16b80 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70  nto a database p
16b90 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  age. This is not
16ba0 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62   actually a prob
16bb0 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20  lem, but it.    
16bc0 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20  ** does cause a 
16bd0 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77  valgrind error w
16be0 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62  hen the 1 or 2 b
16bf0 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69  ytes of unitiali
16c00 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  zed .    ** data
16c10 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79   is passed to sy
16c20 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28  stem call write(
16c30 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74  ). So to avoid t
16c40 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a  his error,.    *
16c50 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  * zero the first
16c60 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70   4 bytes of temp
16c70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20   space here..   
16c80 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a   **.    ** Also:
16c90 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62    Provide four b
16ca0 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69  ytes of initiali
16cb0 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72 65  zed space before
16cc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69   the.    ** begi
16cd0 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61  nning of pTmpSpa
16ce0 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61 76  ce as an area av
16cf0 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65  ailable to prepe
16d00 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65  nd the.    ** le
16d10 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ft-child pointer
16d20 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
16d30 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20  g of a cell..   
16d40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
16d50 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
16d60 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e      memset(pBt->
16d70 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29  pTmpSpace, 0, 8)
16d80 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d  ;.      pBt->pTm
16d90 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20  pSpace += 4;.   
16da0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
16db0 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54  Free the pBt->pT
16dc0 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69  mpSpace allocati
16dd0 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
16de0 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28  d freeTempSpace(
16df0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
16e00 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
16e10 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
16e20 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b  >pTmpSpace -= 4;
16e30 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
16e40 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70  Free(pBt->pTmpSp
16e50 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ace);.    pBt->p
16e60 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20  TmpSpace = 0;.  
16e70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
16e80 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
16e90 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
16ea0 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
16eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16ec0 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
16ed0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16ee0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
16ef0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
16f00 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
16f10 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
16f20 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
16f30 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
16f40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16f50 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
16f60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16f70 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d  ter(p);.  pCur =
16f80 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
16f90 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
16fa0 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
16fb0 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
16fc0 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
16fd0 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
16fe0 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
16ff0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17000 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
17010 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17020 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
17030 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
17040 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
17050 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
17060 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
17070 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
17080 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
17090 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
170a0 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
170b0 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
170c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
170d0 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f  lback(p, SQLITE_
170e0 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
170f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17100 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
17110 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
17120 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
17130 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
17140 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
17150 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
17160 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
17170 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
17180 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
17190 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
171a0 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
171b0 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
171c0 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
171d0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
171e0 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
171f0 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
17200 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
17210 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
17220 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
17230 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
17240 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
17250 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
17260 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
17270 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
17280 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
17290 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
172a0 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
172b0 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
172c0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
172d0 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
172e0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
172f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
17300 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  b);.    if( pBt-
17310 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
17320 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
17330 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
17340 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
17350 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
17360 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
17370 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a   pBt->pSchema);.
17380 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
17390 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
173a0 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
173b0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
173c0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
173d0 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
173e0 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
173f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17400 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
17410 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
17420 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
17430 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
17440 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
17450 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
17460 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
17470 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
17480 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17490 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
174a0 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22  hange the "soft"
174b0 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
174c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
174d0 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55   the cache..** U
174e0 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69  nused and unmodi
174f0 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20  fied pages will 
17500 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e  be recycled when
17510 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
17520 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  * pages in the c
17530 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68 69  ache exceeds thi
17540 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42  s soft limit.  B
17550 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ut the size of t
17560 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61  he.** cache is a
17570 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c  llowed to grow l
17580 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
17590 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74  limit if it cont
175a0 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61  ains.** dirty pa
175b0 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74 69  ges or pages sti
175c0 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73 65  ll in active use
175d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
175e0 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
175f0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
17600 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
17610 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17620 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
17630 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17640 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
17650 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17660 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
17670 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
17680 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
17690 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
176a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
176b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
176c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
176d0 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c  hange the "spill
176e0 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
176f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17700 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
17710 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
17720 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20 74   pages exceeds t
17730 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67  his limit during
17740 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
17750 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67  tion,.** the pag
17760 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74  er might attempt
17770 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65   to "spill" page
17780 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
17790 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64   early in.** ord
177a0 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
177b0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
177c0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
177d0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  s the current sp
177e0 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65  ill size.  If ze
177f0 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20  ro is passed.** 
17800 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20  as an argument, 
17810 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
17820 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c  ade to the spill
17830 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73   size setting, s
17840 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67  o.** using mxPag
17850 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79 20  e of 0 is a way 
17860 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72  to query the cur
17870 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e  rent spill size.
17880 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17890 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65  treeSetSpillSize
178a0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
178b0 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
178c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
178d0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
178e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
178f0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
17900 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
17910 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17920 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  );.  res = sqlit
17930 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73  e3PagerSetSpills
17940 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
17950 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
17960 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17970 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
17980 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
17990 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
179a0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
179b0 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75  imit on the amou
179c0 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nt of the databa
179d0 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79  se file that may
179e0 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61   be.** memory ma
179f0 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pped..*/.int sql
17a00 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70  ite3BtreeSetMmap
17a10 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20  Limit(Btree *p, 
17a20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
17a30 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65  Mmap){.  BtShare
17a40 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17a50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17a60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
17a70 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
17a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17a90 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
17aa0 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
17ab0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73  t(pBt->pPager, s
17ac0 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  zMmap);.  sqlite
17ad0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17af0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
17b00 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
17b10 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
17b20 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
17b30 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
17b40 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
17b50 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
17b60 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
17b70 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
17b80 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
17b90 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
17ba0 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
17bb0 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
17bc0 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
17bd0 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
17be0 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
17bf0 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
17c00 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
17c10 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
17c20 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
17c30 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
17c40 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
17c50 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
17c60 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
17c70 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
17c80 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
17c90 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
17ca0 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
17cb0 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
17cc0 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
17cd0 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
17ce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
17cf0 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
17d00 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
17d10 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65  gerFlags(.  Btre
17d20 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
17d30 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
17d40 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74  to set the safet
17d50 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20  y level on */.  
17d60 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
17d70 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
17d80 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20  s PAGER_* flags 
17d90 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
17da0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
17db0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17dc0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
17dd0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
17de0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17df0 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
17e00 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
17e10 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67  ->pPager, pgFlag
17e20 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
17e30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17e50 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17e60 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
17e70 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
17e80 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
17e90 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
17ea0 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
17eb0 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
17ec0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
17ed0 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
17ee0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
17ef0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
17f00 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
17f10 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
17f20 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
17f30 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
17f40 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
17f50 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
17f60 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
17f70 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
17f80 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
17f90 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
17fa0 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
17fb0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
17fc0 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
17fd0 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
17fe0 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
17ff0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
18000 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18010 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
18020 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
18030 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
18040 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
18050 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
18060 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
18070 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
18080 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
18090 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
180a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
180b0 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
180c0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
180d0 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
180e0 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
180f0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
18100 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
18110 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
18120 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
18130 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
18140 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
18150 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
18160 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
18170 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
18180 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
18190 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
181a0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
181b0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
181c0 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
181d0 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
181e0 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
181f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
18200 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18210 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
18220 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
18230 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
18240 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18250 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c  nter(p);.#if SQL
18260 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
18270 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74  if( nReserve>pBt
18280 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
18290 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52   ) pBt->optimalR
182a0 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65  eserve = (u8)nRe
182b0 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
182c0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
182d0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
182e0 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
182f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18300 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
18310 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
18320 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
18330 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
18340 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
18350 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
18360 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
18370 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
18380 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
18390 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
183a0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
183b0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
183c0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
183d0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
183e0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
183f0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
18400 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
18410 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
18420 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
18430 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
18440 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
18450 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
18460 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
18470 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
18480 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
18490 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
184a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
184b0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
184c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
184d0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
184e0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
184f0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
18500 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
18510 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
18520 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18530 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
18540 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
18550 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
18560 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
18570 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
18580 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
18590 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
185a0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
185b0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
185c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
185d0 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
185e0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
185f0 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
18600 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
18610 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
18620 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
18630 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
18640 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
18650 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
18660 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
18670 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
18680 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
18690 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
186a0 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
186b0 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
186c0 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
186d0 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
186e0 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
186f0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
18700 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
18710 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
18720 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
18730 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
18740 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
18750 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
18760 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
18770 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
18780 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
18790 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
187a0 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
187b0 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
187c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
187d0 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
187e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
187f0 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t n;.  assert( s
18800 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18810 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
18820 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74   );.  n = p->pBt
18830 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
18840 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
18850 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
18860 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18870 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18880 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
18890 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
188a0 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
188b0 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
188c0 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
188d0 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
188e0 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
188f0 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
18900 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
18910 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48  *.** If SQLITE_H
18920 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69  AS_MUTEX is defi
18930 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ned then the num
18940 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ber returned is 
18950 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f  the.** greater o
18960 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  f the current re
18970 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64  served space and
18980 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71   the maximum req
18990 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76  uested.** reserv
189a0 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  e space..*/.int 
189b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f  sqlite3BtreeGetO
189c0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74  ptimalReserve(Bt
189d0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
189e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
189f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
18a00 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
18a10 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29  eserveNoMutex(p)
18a20 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18a30 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
18a40 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  n<p->pBt->optima
18a50 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70  lReserve ) n = p
18a60 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
18a70 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
18a80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18a90 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
18aa0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
18ab0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
18ac0 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
18ad0 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
18ae0 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
18af0 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
18b00 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
18b10 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
18b20 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
18b30 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
18b40 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
18b50 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
18b60 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
18b70 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
18b80 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
18b90 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
18ba0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
18bb0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
18bc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
18bd0 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
18be0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
18bf0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
18c00 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
18c10 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
18c20 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
18c30 75 65 73 20 66 6f 72 20 74 68 65 20 42 54 53 5f  ues for the BTS_
18c40 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e  SECURE_DELETE an
18c50 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  d BTS_OVERWRITE 
18c60 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
18c70 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20 20 20 20  newFlag==0      
18c80 20 42 6f 74 68 20 42 54 53 5f 53 45 43 55 52 45   Both BTS_SECURE
18c90 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f  _DELETE and BTS_
18ca0 4f 56 45 52 57 52 49 54 45 20 61 72 65 20 63 6c  OVERWRITE are cl
18cb0 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46  eared.**    newF
18cc0 6c 61 67 3d 3d 31 20 20 20 20 20 20 20 42 54 53  lag==1       BTS
18cd0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 73  _SECURE_DELETE s
18ce0 65 74 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  et and BTS_OVERW
18cf0 52 49 54 45 20 69 73 20 63 6c 65 61 72 65 64 0a  RITE is cleared.
18d00 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32  **    newFlag==2
18d10 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52         BTS_SECUR
18d20 45 5f 44 45 4c 45 54 45 20 63 6c 65 61 72 65 64  E_DELETE cleared
18d30 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
18d40 54 45 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20  TE is set.**    
18d50 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20  newFlag==(-1)   
18d60 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a   No changes.**.*
18d70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
18d80 63 74 73 20 61 73 20 61 20 71 75 65 72 79 20 69  cts as a query i
18d90 66 20 6e 65 77 46 6c 61 67 20 69 73 20 6c 65 73  f newFlag is les
18da0 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a  s than zero.**.*
18db0 2a 20 57 69 74 68 20 42 54 53 5f 4f 56 45 52 57  * With BTS_OVERW
18dc0 52 49 54 45 20 73 65 74 2c 20 64 65 6c 65 74 65  RITE set, delete
18dd0 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65  d content is ove
18de0 72 77 72 69 74 74 65 6e 20 62 79 20 7a 65 72 6f  rwritten by zero
18df0 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69  s, but.** freeli
18e00 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 61 72  st leaf pages ar
18e10 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 62 61  e not written ba
18e20 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ck to the databa
18e30 73 65 2e 20 20 54 68 75 73 20 69 6e 2d 70 61 67  se.  Thus in-pag
18e40 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e  e.** deleted con
18e50 74 65 6e 74 20 69 73 20 63 6c 65 61 72 65 64 2c  tent is cleared,
18e60 20 62 75 74 20 66 72 65 65 6c 69 73 74 20 64 65   but freelist de
18e70 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73  leted content is
18e80 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68   not..**.** With
18e90 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18ea0 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  TE, operation is
18eb0 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52 57 52   like BTS_OVERWR
18ec0 49 54 45 20 77 69 74 68 20 74 68 65 20 61 64 64  ITE with the add
18ed0 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72  ition.** that fr
18ee0 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  eelist leaf page
18ef0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 62 61  s are written ba
18f00 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
18f10 62 61 73 65 2c 20 69 6e 63 72 65 61 73 69 6e 67  base, increasing
18f20 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  .** the amount o
18f30 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69  f disk I/O..*/.i
18f40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
18f50 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65  ecureDelete(Btre
18f60 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61  e *p, int newFla
18f70 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69  g){.  int b;.  i
18f80 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
18f90 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
18fa0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
18fb0 73 65 72 74 28 20 42 54 53 5f 4f 56 45 52 57 52  sert( BTS_OVERWR
18fc0 49 54 45 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f  ITE==BTS_SECURE_
18fd0 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61 73  DELETE*2 );.  as
18fe0 73 65 72 74 28 20 42 54 53 5f 46 41 53 54 5f 53  sert( BTS_FAST_S
18ff0 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52  ECURE==(BTS_OVER
19000 57 52 49 54 45 7c 42 54 53 5f 53 45 43 55 52 45  WRITE|BTS_SECURE
19010 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20 20 69 66  _DELETE) );.  if
19020 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a  ( newFlag>=0 ){.
19030 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46      p->pBt->btsF
19040 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 46 41 53  lags &= ~BTS_FAS
19050 54 5f 53 45 43 55 52 45 3b 0a 20 20 20 20 70 2d  T_SECURE;.    p-
19060 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c  >pBt->btsFlags |
19070 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
19080 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d  ETE*newFlag;.  }
19090 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e  .  b = (p->pBt->
190a0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
190b0 41 53 54 5f 53 45 43 55 52 45 29 2f 42 54 53 5f  AST_SECURE)/BTS_
190c0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
190d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
190e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
190f0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  b;.}../*.** Chan
19100 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
19110 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
19120 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
19130 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
19140 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
19150 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
19160 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
19170 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
19180 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
19190 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
191a0 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
191b0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
191c0 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
191d0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
191e0 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
191f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
19200 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
19210 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
19220 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
19230 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
19240 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
19250 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
19260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
19270 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
19280 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19290 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
192a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
192b0 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
192c0 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
192d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
192e0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
192f0 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
19300 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26  SIZE_FIXED)!=0 &
19310 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74  & (av ?1:0)!=pBt
19320 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
19330 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19340 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
19350 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
19360 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30  Vacuum = av ?1:0
19370 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
19380 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31  acuum = av==2 ?1
19390 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  :0;.  }.  sqlite
193a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
193b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
193c0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
193d0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
193e0 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
193f0 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
19400 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
19410 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
19420 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
19430 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
19440 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
19450 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
19460 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
19470 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
19480 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
19490 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
194a0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
194b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
194c0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
194d0 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
194e0 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
194f0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
19500 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
19510 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
19520 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
19530 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
19540 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
19550 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19560 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19570 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
19580 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75  ../*.** If the u
19590 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65 74 20  ser has not set 
195a0 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c  the safety-level
195b0 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
195c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
195d0 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73   using "PRAGMA s
195e0 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64  ynchronous", and
195f0 20 69 66 20 74 68 65 20 73 61 66 65 74 79 2d 6c   if the safety-l
19600 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  evel is not alre
19610 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68  ady.** set to th
19620 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74  e value passed t
19630 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
19640 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
19650 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20  rameter,.** set 
19660 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51  it so..*/.#if SQ
19670 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e  LITE_DEFAULT_SYN
19680 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45  CHRONOUS!=SQLITE
19690 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e  _DEFAULT_WAL_SYN
196a0 43 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26  CHRONOUS \.    &
196b0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
196c0 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74  E_OMIT_WAL).stat
196d0 69 63 20 76 6f 69 64 20 73 65 74 44 65 66 61 75  ic void setDefau
196e0 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61  ltSyncFlag(BtSha
196f0 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66  red *pBt, u8 saf
19700 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71  ety_level){.  sq
19710 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
19720 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d  *pDb;.  if( (db=
19730 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28  pBt->db)!=0 && (
19740 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20  pDb=db->aDb)!=0 
19750 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44  ){.    while( pD
19760 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62  b->pBt==0 || pDb
19770 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20  ->pBt->pBt!=pBt 
19780 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20  ){ pDb++; }.    
19790 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65  if( pDb->bSyncSe
197a0 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44  t==0 .     && pD
197b0 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21  b->safety_level!
197c0 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20  =safety_level . 
197d0 20 20 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d      && pDb!=&db-
197e0 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a  >aDb[1] .    ){.
197f0 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74        pDb->safet
19800 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79  y_level = safety
19810 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71  _level;.      sq
19820 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
19830 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a  gs(pBt->pPager,.
19840 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
19850 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64  afety_level | (d
19860 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52  b->flags & PAGER
19870 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20  _FLAGS_MASK));. 
19880 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
19890 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44 65 66  .# define setDef
198a0 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
198b0 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23  ,safety_level).#
198c0 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
198d0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
198e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
198f0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
19900 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  *);.../*.** Get 
19910 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
19920 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
19930 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
19940 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
19950 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
19960 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
19970 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
19980 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
19990 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
199a0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
199b0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
199c0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
199d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
199e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
199f0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
19a00 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
19a10 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
19a20 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
19a30 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
19a40 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
19a50 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
19a60 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
19a70 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
19a80 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
19a90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
19aa0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
19ab0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
19ac0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
19ad0 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
19ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19af0 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67  le */.  u32 nPag
19b00 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
19b10 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
19b20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
19b30 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 46 69  */.  u32 nPageFi
19b40 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
19b50 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
19b60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19b70 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65  e */.  u32 nPage
19b80 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
19b90 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19ba0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
19bb0 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
19bc0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
19bd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19be0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19bf0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
19c00 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
19c10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
19c20 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
19c30 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
19c40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
19c50 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
19c60 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
19c70 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
19c80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19c90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
19ca0 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
19cb0 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
19cc0 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
19cd0 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
19ce0 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
19cf0 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
19d00 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
19d10 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
19d20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
19d30 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
19d40 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
19d50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
19d60 61 67 65 72 2c 20 28 69 6e 74 2a 29 26 6e 50 61  ager, (int*)&nPa
19d70 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e  geFile);.  if( n
19d80 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  Page==0 || memcm
19d90 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31  p(24+(u8*)pPage1
19da0 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a  ->aData, 92+(u8*
19db0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34  )pPage1->aData,4
19dc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
19dd0 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20  e = nPageFile;. 
19de0 20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 64   }.  if( (pBt->d
19df0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
19e00 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29  E_ResetDatabase)
19e10 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
19e20 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
19e30 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75  nPage>0 ){.    u
19e40 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32 pageSize;.   
19e50 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b   u32 usableSize;
19e60 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
19e70 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
19e80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19e90 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45  NOTADB;.    /* E
19ea0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
19eb0 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20  737-39999 Every 
19ec0 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74  valid SQLite dat
19ed0 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e  abase file begin
19ee0 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
19ef0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62  e following 16 b
19f00 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35  ytes (in hex): 5
19f10 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35  3 51 4c 69 74 65
19f20 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a   20 66 6f 72 6d.
19f30 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20      ** 61 74 20 
19f40 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66  33 00. */.    if
19f50 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
19f60 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
19f70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
19f80 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
19f90 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  iled;.    }..#if
19fa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19fb0 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65  WAL.    if( page
19fc0 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
19fd0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
19fe0 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
19ff0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a000 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
1a010 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1a020 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1a030 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
1a040 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20  page1[18]>2 ){. 
1a050 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1a060 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
1a070 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
1a080 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29  f( page1[19]>2 )
1a090 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1a0a0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1a0b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1a0c0 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69   the write versi
1a0d0 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20  on is set to 2, 
1a0e0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68  this database sh
1a0f0 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64  ould be accessed
1a100 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d  .    ** in WAL m
1a110 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20  ode. If the log 
1a120 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1a130 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  pen, open it now
1a140 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72  . Then .    ** r
1a150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1a160 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f  and return witho
1a170 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74  ut populating Bt
1a180 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20  Shared.pPage1.. 
1a190 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72     ** The caller
1a1a0 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e   detects this an
1a1b0 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  d calls this fun
1a1c0 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69  ction again. Thi
1a1d0 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  s is.    ** requ
1a1e0 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73  ired as the vers
1a1f0 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75  ion of page 1 cu
1a200 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
1a210 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20  age1 buffer.    
1a220 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68  ** may not be th
1a230 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
1a240 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20   - there may be 
1a250 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74  a newer one in t
1a260 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69  he log.    ** fi
1a270 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
1a280 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20  f( page1[19]==2 
1a290 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
1a2a0 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d  s & BTS_NO_WAL)=
1a2b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1a2c0 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  isOpen = 0;.    
1a2d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a2e0 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e  gerOpenWal(pBt->
1a2f0 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29  pPager, &isOpen)
1a300 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1a310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a320 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1a330 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1a340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a350 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63    setDefaultSync
1a360 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45  Flag(pBt, SQLITE
1a370 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e  _DEFAULT_WAL_SYN
1a380 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20  CHRONOUS+1);.   
1a390 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d       if( isOpen=
1a3a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a3b0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70  releasePageOne(p
1a3c0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
1a3d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a3e0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
1a3f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1a400 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
1a410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a420 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
1a430 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
1a440 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
1a450 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65  OUS+1);.    }.#e
1a460 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49  ndif..    /* EVI
1a470 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36  DENCE-OF: R-1546
1a480 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69  5-20813 The maxi
1a490 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20  mum and minimum 
1a4a0 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
1a4b0 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e  .    ** fraction
1a4c0 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70  s and the leaf p
1a4d0 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20  ayload fraction 
1a4e0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36  values must be 6
1a4f0 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20  4, 32, and 32.. 
1a500 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1a510 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
1a520 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
1a530 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
1a540 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
1a550 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
1a560 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
1a570 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
1a580 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
1a590 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
1a5a0 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
1a5b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
1a5c0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1a5d0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
1a5e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a5f0 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
1a600 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
1a610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a620 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
1a630 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
1a640 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
1a650 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
1a660 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
1a670 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
1a680 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
1a690 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1a6a0 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61    pageSize = (pa
1a6b0 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70  ge1[16]<<8) | (p
1a6c0 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  age1[17]<<16);. 
1a6d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a6e0 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38  F: R-25008-21688
1a6f0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70   The size of a p
1a700 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f  age is a power o
1a710 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74  f two.    ** bet
1a720 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
1a730 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f  36 inclusive. */
1a740 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
1a750 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
1a760 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  !=0.     || page
1a770 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
1a780 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20  PAGE_SIZE .     
1a790 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36  || pageSize<=256
1a7a0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
1a7b0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1a7c0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1a7d0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1a7e0 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
1a7f0 49 58 45 44 3b 0a 20 20 20 20 61 73 73 65 72 74  IXED;.    assert
1a800 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
1a810 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
1a820 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
1a830 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
1a840 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
1a850 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
1a860 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
1a870 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
1a880 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1a890 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
1a8a0 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
1a8b0 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
1a8c0 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
1a8d0 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
1a8e0 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
1a8f0 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
1a900 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
1a910 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
1a920 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
1a930 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
1a940 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
1a950 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
1a960 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
1a970 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
1a980 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
1a990 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
1a9a0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
1a9b0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
1a9c0 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
1a9d0 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
1a9e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
1a9f0 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
1aa00 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1aa10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
1aa20 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
1aa30 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
1aa40 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
1aa50 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
1aa60 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
1aa70 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
1aa80 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
1aa90 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
1aaa0 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
1aab0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
1aac0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
1aad0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1aae0 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
1aaf0 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
1ab00 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
1ab10 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
1ab20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
1ab30 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1ab40 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
1ab50 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
1ab60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1ab70 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
1ab80 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
1ab90 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
1aba0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
1abb0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
1abc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1abd0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
1abe0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
1abf0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
1ac20 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
1ac30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ac40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ac50 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53  sqlite3WritableS
1ac60 63 68 65 6d 61 28 70 42 74 2d 3e 64 62 29 3d 3d  chema(pBt->db)==
1ac70 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65  0 && nPage>nPage
1ac80 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
1ac90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1aca0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
1acb0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1acc0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1acd0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1ace0 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f  R-28312-64704 Ho
1acf0 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c  wever, the usabl
1ad00 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c  e size is not al
1ad10 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  lowed to.    ** 
1ad20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30  be less than 480
1ad30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
1ad40 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
1ad50 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20  ze is 512, then 
1ad60 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72  the.    ** reser
1ad70 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63  ved space size c
1ad80 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e  annot exceed 32.
1ad90 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62   */.    if( usab
1ada0 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
1adb0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1adc0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1add0 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
1ade0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
1adf0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1ae00 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1ae10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1ae20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1ae30 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
1ae40 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
1ae50 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
1ae60 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
1ae70 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
1ae80 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
1ae90 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
1aea0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
1aeb0 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
1aec0 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
1aed0 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
1aee0 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
1aef0 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
1af00 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
1af10 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
1af20 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
1af30 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
1af40 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
1af50 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
1af60 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
1af70 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
1af80 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
1af90 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
1afa0 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
1afb0 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
1afc0 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
1afd0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
1afe0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
1aff0 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
1b000 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
1b010 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
1b020 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
1b030 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
1b040 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
1b050 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
1b060 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
1b070 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
1b080 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
1b090 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
1b0a0 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
1b0b0 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
1b0c0 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
1b0d0 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
1b0e0 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
1b0f0 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
1b100 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
1b110 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1b120 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
1b130 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
1b140 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
1b150 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
1b160 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
1b170 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
1b180 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
1b190 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
1b1a0 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
1b1b0 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
1b1c0 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
1b1d0 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70  5 - 23);.  if( p
1b1e0 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37  Bt->maxLocal>127
1b1f0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78   ){.    pBt->max
1b200 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31  1bytePayload = 1
1b210 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  27;.  }else{.   
1b220 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
1b230 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d  yload = (u8)pBt-
1b240 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >maxLocal;.  }. 
1b250 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
1b260 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
1b270 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
1b280 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
1b290 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
1b2a0 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
1b2b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b2c0 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
1b2d0 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
1b2e0 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
1b2f0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
1b300 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1b310 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
1b320 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
1b330 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1b340 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
1b350 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72  pBt. This is for
1b360 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
1b370 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
1b380 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
1b390 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
1b3a0 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
1b3b0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ned..**.** Only 
1b3c0 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
1b3d0 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f  e counted if wrO
1b3e0 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66  nly is true.  If
1b3f0 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61   wrOnly is.** fa
1b400 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72  lse then all cur
1b410 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
1b420 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
1b430 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
1b440 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73   routine, a curs
1b450 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
1b460 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
1b470 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f  ble of reading o
1b480 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  r writing to the
1b490 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73   database.  Curs
1b4a0 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65  ors that.** have
1b4b0 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e   been tripped in
1b4c0 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41  to the CURSOR_FA
1b4d0 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f  ULT state are no
1b4e0 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74  t counted..*/.st
1b4f0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61  atic int countVa
1b500 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61  lidCursors(BtSha
1b510 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72  red *pBt, int wr
1b520 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
1b530 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
1b540 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
1b550 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
1b560 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
1b570 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1b580 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70  (wrOnly==0 || (p
1b590 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
1b5a0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21  BTCF_WriteFlag)!
1b5b0 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72  =0).     && pCur
1b5c0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
1b5d0 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
1b5e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
1b5f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
1b600 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
1b610 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
1b620 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
1b630 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
1b640 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
1b650 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
1b660 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
1b670 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
1b680 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
1b690 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
1b6a0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1b6b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
1b6c0 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
1b6d0 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
1b6e0 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
1b6f0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
1b700 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
1b710 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
1b720 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1b730 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1b740 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
1b750 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
1b760 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
1b770 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1b780 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1b790 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1b7a0 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
1b7b0 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c  ors(pBt,0)==0 ||
1b7c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b7d0 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ion>TRANS_NONE )
1b7e0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
1b7f0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1b800 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
1b810 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
1b820 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1b830 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1b840 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b850 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
1b860 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1b870 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
1b880 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
1b890 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
1b8a0 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
1b8b0 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
1b8c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
1b8d0 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
1b8e0 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
1b8f0 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
1b900 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
1b910 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
1b920 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
1b930 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
1b940 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
1b950 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1b960 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
1b970 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
1b980 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
1b990 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
1b9a0 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
1b9b0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1b9c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b9d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1b9e0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
1b9f0 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
1ba00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ba10 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
1ba20 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
1ba30 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
1ba40 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
1ba50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ba60 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
1ba70 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
1ba80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ba90 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
1baa0 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
1bab0 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
1bac0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
1bad0 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1bae0 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31  ==16 );.  data[1
1baf0 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  6] = (u8)((pBt->
1bb00 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66  pageSize>>8)&0xf
1bb10 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d  f);.  data[17] =
1bb20 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
1bb30 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b  Size>>16)&0xff);
1bb40 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
1bb50 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
1bb60 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1bb70 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
1bb80 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
1bb90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
1bba0 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
1bbb0 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
1bbc0 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
1bbd0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
1bbe0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
1bbf0 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
1bc00 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
1bc10 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
1bc20 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
1bc30 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
1bc40 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
1bc50 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
1bc60 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
1bc70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1bc80 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
1bc90 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
1bca0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1bcb0 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
1bcc0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
1bcd0 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
1bce0 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
1bcf0 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
1bd00 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
1bd10 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
1bd20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
1bd30 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
1bd40 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
1bd50 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
1bd60 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
1bd70 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
1bd80 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
1bd90 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
1bda0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
1bdb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1bdc0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1bdd0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1bde0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1bdf0 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61  (creating a data
1be00 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69  base.** consisti
1be10 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  ng of a single p
1be20 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d  age and no schem
1be30 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75  a objects). Retu
1be40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1be50 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
1be60 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
1be70 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
1be80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1be90 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65  BtreeNewDb(Btree
1bea0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1beb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1bec0 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
1bed0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  ->nPage = 0;.  r
1bee0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1bef0 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  p->pBt);.  sqlit
1bf00 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1bf10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bf20 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1bf30 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
1bf40 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
1bf50 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
1bf60 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
1bf70 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1bf80 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
1bf90 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
1bfa0 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
1bfb0 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
1bfc0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
1bfd0 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
1bfe0 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
1bff0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
1c000 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
1c010 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1c020 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
1c030 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
1c040 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
1c050 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
1c060 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
1c070 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
1c080 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
1c090 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
1c0a0 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
1c0b0 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
1c0c0 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
1c0d0 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
1c0e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
1c0f0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1c100 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
1c110 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
1c120 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
1c130 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1c140 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
1c150 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
1c160 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
1c170 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
1c180 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
1c190 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
1c1a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
1c1b0 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
1c1c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c1d0 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
1c1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1c1f0 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
1c200 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1c210 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
1c220 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1c230 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
1c240 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c250 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
1c260 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
1c270 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
1c280 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
1c290 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
1c2a0 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
1c2b0 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
1c2c0 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
1c2d0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
1c2e0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
1c2f0 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
1c300 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1c310 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
1c320 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
1c330 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
1c340 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
1c350 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
1c360 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1c370 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
1c380 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
1c390 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1c3a0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
1c3b0 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
1c3c0 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
1c3d0 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1c3e0 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
1c3f0 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
1c400 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
1c410 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
1c420 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
1c430 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
1c440 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
1c450 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
1c460 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
1c470 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
1c480 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
1c490 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
1c4a0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1c4b0 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
1c4c0 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
1c4d0 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
1c4e0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
1c4f0 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
1c500 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
1c510 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
1c520 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
1c530 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
1c540 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
1c550 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
1c560 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
1c570 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
1c580 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
1c590 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
1c5a0 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
1c5b0 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
1c5c0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1c5d0 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
1c5e0 74 20 77 72 66 6c 61 67 2c 20 69 6e 74 20 2a 70  t wrflag, int *p
1c5f0 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 29 7b 0a  SchemaVersion){.
1c600 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c610 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
1c620 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c630 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1c640 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1c650 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1c660 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
1c670 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1c680 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1c690 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
1c6a0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
1c6b0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1c6c0 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
1c6d0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
1c6e0 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
1c6f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1c700 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1c710 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1c720 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
1c730 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
1c740 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
1c750 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1c760 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
1c770 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1c780 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49  TRANS_WRITE || I
1c790 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
1c7a0 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20  bDoTruncate)==0 
1c7b0 29 3b 0a 0a 20 20 69 66 28 20 28 70 2d 3e 64 62  );..  if( (p->db
1c7c0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1c7d0 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29 20  _ResetDatabase) 
1c7e0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61  .   && sqlite3Pa
1c7f0 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
1c800 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 0a 20  t->pPager)==0 . 
1c810 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   ){.    pBt->bts
1c820 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 52 45  Flags &= ~BTS_RE
1c830 41 44 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20  AD_ONLY;.  }..  
1c840 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
1c850 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
1c860 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
1c870 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
1c880 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
1c890 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1c8a0 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
1c8b0 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
1c8c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1c8d0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
1c8e0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
1c8f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c900 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1c910 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  {.    sqlite3 *p
1c920 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f  Block = 0;.    /
1c930 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
1c940 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
1c950 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
1c960 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
1c970 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ion .    ** on t
1c980 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
1c990 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
1c9a0 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
1c9b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20  ansaction is.   
1c9c0 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
1c9d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1c9e0 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  KED..    */.    
1c9f0 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
1ca00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1ca10 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
1ca20 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74       || (pBt->bt
1ca30 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
1ca40 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a  DING)!=0.    ){.
1ca50 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
1ca60 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
1ca70 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
1ca80 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20  rflag>1 ){.     
1ca90 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
1caa0 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d        for(pIter=
1cab0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1cac0 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
1cad0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
1cae0 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1caf0 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
1cb00 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
1cb10 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
1cb20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1cb30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cb40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1cb50 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73  Block ){.      s
1cb60 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
1cb70 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
1cb80 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63  Block);.      rc
1cb90 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
1cba0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
1cbb0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1cbc0 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egun;.    }.  }.
1cbd0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
1cbe0 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
1cbf0 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
1cc00 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
1cc10 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
1cc20 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
1cc30 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
1cc40 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
1cc50 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
1cc60 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
1cc70 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
1cc80 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
1cc90 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
1cca0 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
1ccb0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1ccc0 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
1ccd0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
1cce0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1ccf0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1cd00 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c  n;..  pBt->btsFl
1cd10 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54  ags &= ~BTS_INIT
1cd20 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69  IALLY_EMPTY;.  i
1cd30 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  f( pBt->nPage==0
1cd40 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1cd50 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c   |= BTS_INITIALL
1cd60 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a  Y_EMPTY;.  do {.
1cd70 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
1cd80 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
1cd90 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
1cda0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
1cdb0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
1cdc0 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
1cdd0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
1cde0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
1cdf0 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
1ce00 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1ce10 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
1ce20 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
1ce30 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
1ce40 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
1ce50 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
1ce60 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1ce70 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ce80 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
1ce90 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
1cea0 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
1ceb0 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
1cec0 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
1ced0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
1cee0 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
1cef0 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
1cf00 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
1cf10 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
1cf20 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
1cf30 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
1cf40 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
1cf50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cf60 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
1cf70 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d  .      if( (pBt-
1cf80 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1cf90 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  READ_ONLY)!=0 ){
1cfa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1cfb0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1cfc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cfd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cfe0 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
1cff0 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
1d000 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
1d010 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
1d020 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d040 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
1d050 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
1d060 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
1d070 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41  =SQLITE_BUSY_SNA
1d080 50 53 48 4f 54 20 26 26 20 70 42 74 2d 3e 69 6e  PSHOT && pBt->in
1d090 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1d0a0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1d0b0 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 72 65       /* if there
1d0c0 20 77 61 73 20 6e 6f 20 74 72 61 6e 73 61 63 74   was no transact
1d0d0 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68 65 6e 20  ion opened when 
1d0e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
1d0f0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1d100 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c 49 54 45  alled and SQLITE
1d110 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 69  _BUSY_SNAPSHOT i
1d120 73 20 72 65 74 75 72 6e 65 64 2c 20 63 68 61 6e  s returned, chan
1d130 67 65 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  ge the error.   
1d140 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 74         ** code t
1d150 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a  o SQLITE_BUSY. *
1d160 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1d170 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d190 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1d1a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d1b0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
1d1c0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1d1d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
1d1e0 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
1d1f0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
1d200 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1d210 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
1d220 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
1d230 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
1d240 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  Bt) );.  sqlite3
1d250 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69  PagerResetLockTi
1d260 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61 67 65  meout(pBt->pPage
1d270 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  r);..  if( rc==S
1d280 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d290 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1d2a0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1d2b0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
1d2c0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
1d2d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1d2e0 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1d2f0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
1d300 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1d310 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
1d320 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
1d330 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
1d340 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
1d350 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
1d360 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1d370 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1d380 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
1d390 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
1d3a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
1d3b0 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
1d3c0 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
1d3d0 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
1d3e0 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
1d3f0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
1d400 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1d410 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
1d420 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
1d430 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
1d440 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
1d450 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
1d460 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1d470 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
1d480 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1d490 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
1d4a0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
1d4b0 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
1d4c0 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
1d4d0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1d4e0 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
1d4f0 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
1d500 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
1d510 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1d520 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
1d530 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
1d540 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
1d550 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
1d560 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
1d570 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
1d580 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
1d590 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
1d5a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
1d5b0 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
1d5c0 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
1d5d0 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
1d5e0 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
1d5f0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1d600 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
1d610 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
1d620 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1d630 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
1d640 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
1d650 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
1d660 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
1d670 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1d680 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
1d690 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1d6a0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
1d6b0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1d6c0 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
1d6d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d6e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1d6f0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1d700 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1d710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d720 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1d730 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1d740 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1d750 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d760 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72   }.    }.  }..tr
1d770 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
1d780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d790 7b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65 6d  {.    if( pSchem
1d7a0 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20  aVersion ){.    
1d7b0 20 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69 6f    *pSchemaVersio
1d7c0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  n = get4byte(&pB
1d7d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1d7e0 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [40]);.    }.   
1d7f0 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
1d800 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
1d810 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
1d820 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
1d830 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
1d840 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 6f  er of.      ** o
1d850 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
1d860 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
1d870 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
1d880 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
1d890 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
1d8a0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
1d8b0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
1d8c0 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
1d8d0 65 64 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  ed here..      *
1d8e0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
1d8f0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1d900 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1d910 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
1d920 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
1d930 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
1d940 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
1d950 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1d960 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d970 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d980 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
1d990 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
1d9a0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
1d9b0 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
1d9c0 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
1d9d0 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
1d9e0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
1d9f0 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
1da00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1da10 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
1da20 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
1da30 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
1da40 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
1da50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1da60 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
1da70 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
1da80 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
1dab0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
1dac0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
1daf0 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
1db00 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1db30 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
1db40 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1db50 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
1db60 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
1db70 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
1db80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1db90 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1dba0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 70  tex) );.  rc = p
1dbb0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53  Page->isInit ? S
1dbc0 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65  QLITE_OK : btree
1dbd0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1dbe0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1dbf0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1dc00 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
1dc10 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
1dc20 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
1dc30 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
1dc40 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1dc50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
1dc60 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
1dc70 50 61 67 65 2c 20 70 50 61 67 65 2c 20 70 43 65  Page, pPage, pCe
1dc80 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
1dc90 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1dca0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
1dcb0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1dcc0 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
1dcd0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1dce0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1dcf0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1dd00 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1dd10 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1dd20 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
1dd30 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1dd40 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1dd50 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1dd60 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
1dd70 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1dd80 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1dd90 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1dda0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1ddb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
1ddc0 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
1ddd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1dde0 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
1ddf0 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
1de00 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
1de10 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
1de20 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
1de30 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
1de40 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
1de50 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
1de60 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1de70 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
1de80 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
1de90 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1dea0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1deb0 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1ded0 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
1dee0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1def0 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
1df00 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1df10 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1df20 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
1df50 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
1df60 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
1df70 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1df80 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
1df90 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
1dfa0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1dfb0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
1dfc0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1dfd0 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
1dfe0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
1dff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e000 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1e010 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
1e020 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
1e030 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
1e040 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1e050 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1e060 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1e070 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1e080 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1e090 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
1e0a0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
1e0b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1e0c0 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
1e0d0 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
1e0e0 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
1e0f0 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
1e100 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
1e110 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
1e120 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1e130 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
1e140 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e150 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
1e160 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
1e170 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
1e180 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
1e190 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e1a0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
1e1b0 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ell;.    int rc;
1e1c0 0a 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  ..    rc = pPage
1e1d0 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54  ->isInit ? SQLIT
1e1e0 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74  E_OK : btreeInit
1e1f0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
1e200 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e210 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   rc;.    nCell =
1e220 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1e230 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1e240 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1e250 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1e260 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1e270 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1e280 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1e290 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
1e2a0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1e2b0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
1e2c0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
1e2d0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1e2e0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e        if( info.n
1e2f0 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c  Local<info.nPayl
1e300 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
1e310 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
1e320 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61  nSize > pPage->a
1e330 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d  Data+pPage->pBt-
1e340 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
1e350 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1e360 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e370 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
1e380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e390 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
1e3a0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e  et4byte(pCell+in
1e3b0 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20  fo.nSize-4) ){. 
1e3c0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1e3d0 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1e3e0 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20  Size-4, iTo);.  
1e3f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1e400 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1e420 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1e430 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
1e440 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1e450 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1e460 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
1e470 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e480 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e490 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
1e4a0 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
1e4b0 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
1e4c0 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
1e4d0 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
1e4e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1e4f0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1e500 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1e510 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e520 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
1e530 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1e540 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e550 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1e560 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
1e570 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   iTo);.    }.  }
1e580 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e590 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
1e5a0 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
1e5b0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1e5c0 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
1e5d0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
1e5e0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
1e5f0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
1e600 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
1e610 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
1e620 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
1e630 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
1e640 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
1e650 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
1e660 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
1e670 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
1e680 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
1e690 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
1e6a0 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
1e6b0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
1e6c0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1e6d0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
1e6e0 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
1e6f0 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
1e700 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
1e710 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1e720 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
1e730 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
1e740 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
1e750 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
1e760 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
1e770 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
1e780 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1e790 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
1e7a0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1e7b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
1e7c0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
1e7d0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
1e7e0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
1e7f0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1e800 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
1e810 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1e820 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
1e830 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
1e840 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1e850 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
1e860 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
1e870 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1e880 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
1e890 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
1e8a0 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
1e8b0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1e8c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
1e8d0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1e8e0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
1e8f0 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
1e900 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1e910 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
1e920 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
1e930 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1e940 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
1e950 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
1e960 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
1e970 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1e980 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1e990 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
1e9a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1e9b0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1e9c0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1e9d0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
1e9e0 74 20 29 3b 0a 20 20 69 66 28 20 69 44 62 50 61  t );.  if( iDbPa
1e9f0 67 65 3c 33 20 29 20 72 65 74 75 72 6e 20 53 51  ge<3 ) return SQ
1ea00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1ea10 54 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  T;..  /* Move pa
1ea20 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
1ea30 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
1ea40 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
1ea50 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
1ea60 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
1ea70 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
1ea80 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
1ea90 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
1eaa0 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
1eab0 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
1eac0 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
1ead0 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
1eae0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1eaf0 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
1eb00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
1eb10 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
1eb20 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
1eb30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1eb40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1eb50 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
1eb60 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
1eb70 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
1eb80 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
1eb90 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
1eba0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
1ebb0 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
1ebc0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1ebd0 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
1ebe0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1ebf0 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
1ec00 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
1ec10 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
1ec20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
1ec30 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
1ec40 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
1ec50 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
1ec60 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
1ec70 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
1ec80 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1ec90 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
1eca0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
1ecb0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
1ecc0 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
1ecd0 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
1ece0 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
1ecf0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
1ed00 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
1ed10 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1ed20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1ed30 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1ed40 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
1ed50 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
1ed60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ed70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1ed80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ed90 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1eda0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
1edb0 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
1edc0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
1edd0 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
1ede0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1edf0 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
1ee00 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
1ee10 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
1ee20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ee30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ee40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ee50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1ee60 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
1ee70 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
1ee80 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
1ee90 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
1eea0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
1eeb0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
1eec0 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
1eed0 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
1eee0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
1eef0 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
1ef00 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
1ef10 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1ef20 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
1ef30 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
1ef40 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
1ef50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1ef60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ef70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ef80 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
1ef90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1efa0 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
1efb0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1efc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1efd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1efe0 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
1eff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f000 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
1f010 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
1f020 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
1f030 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1f040 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
1f050 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1f060 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f070 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
1f080 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
1f090 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
1f0a0 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
1f0b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1f0c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
1f0d0 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
1f0e0 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
1f0f0 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
1f100 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
1f110 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
1f120 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
1f130 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
1f140 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
1f150 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
1f160 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
1f170 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
1f180 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
1f190 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
1f1a0 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
1f1b0 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
1f1c0 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70  d therefore no p
1f1d0 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c  oint in .** call
1f1e0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1f1f0 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
1f200 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72   SQLITE_DONE. Or
1f210 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  , if an error .*
1f220 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  * occurs, return
1f230 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1f240 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  r code..**.** Mo
1f250 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c  re specifically,
1f260 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1f270 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
1f280 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62  ganize the datab
1f290 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20  ase so .** that 
1f2a0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
1f2b0 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
1f2c0 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f  tly in use is no
1f2d0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
1f2e0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
1f2f0 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  nFin is the numb
1f300 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
1f310 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
1f320 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
1f330 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  were this functi
1f340 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20  on called until 
1f350 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1f360 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  E_DONE..**.** If
1f370 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72   the bCommit par
1f380 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
1f390 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ro, this functio
1f3a0 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  n assumes that t
1f3b0 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69  he .** caller wi
1f3c0 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
1f3d0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1f3e0 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
1f3f0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a  s SQLITE_DONE .*
1f400 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62  * or an error. b
1f410 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64  Commit is passed
1f420 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74   true for an aut
1f430 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d  o-vacuum-on-comm
1f440 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  it .** operation
1f450 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61  , or false for a
1f460 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1f470 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cuum..*/.static 
1f480 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
1f490 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
1f4a0 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
1f4b0 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62  o iLastPg, int b
1f4c0 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20  Commit){.  Pgno 
1f4d0 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
1f4e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f4f0 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
1f500 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
1f510 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
1f520 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1f530 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1f540 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1f550 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20  t( iLastPg>nFin 
1f560 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41  );..  if( !PTRMA
1f570 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
1f580 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
1f590 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
1f5a0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1f5b0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
1f5c0 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
1f5d0 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
1f5e0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1f5f0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1f600 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
1f610 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
1f620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1f630 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
1f640 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1f650 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
1f660 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
1f670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f690 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1f6a0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1f6b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1f6c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1f6d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f6e0 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
1f6f0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1f700 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1f710 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1f720 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1f730 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
1f740 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
1f750 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
1f760 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
1f770 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f         ** if bCo
1f780 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mmit is non-zero
1f790 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
1f7a0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
1f7b0 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
1f7c0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
1f7d0 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
1f7e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
1f7f0 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
1f800 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
1f810 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
1f820 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
1f830 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
1f840 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1f850 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
1f860 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1f870 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1f880 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1f890 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1f8a0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1f8b0 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f  LastPg, BTALLOC_
1f8c0 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20  EXACT);.        
1f8d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f8e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1f8f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f900 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1f910 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
1f920 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
1f930 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
1f940 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
1f950 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1f960 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
1f970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1f980 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
1f990 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
1f9a0 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
1f9b0 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20  Page *pLastPg;. 
1f9c0 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20       u8 eMode = 
1f9d0 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f  BTALLOC_ANY;   /
1f9e0 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  * Mode parameter
1f9f0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1fa00 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20  eePage() */.    
1fa10 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30    Pgno iNear = 0
1fa20 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e  ;           /* n
1fa30 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20  earby parameter 
1fa40 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1fa50 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20  ePage() */..    
1fa60 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1fa70 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
1fa80 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
1fa90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1faa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fab0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fac0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1fad0 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65  If bCommit is ze
1fae0 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
1faf0 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
1fb00 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
1fb10 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
1fb20 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
1fb30 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
1fb40 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
1fb50 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
1fb60 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
1fb70 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
1fb80 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74  bCommit is great
1fb90 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
1fba0 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
1fbb0 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
1fbc0 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
1fbd0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
1fbe0 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
1fbf0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
1fc00 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
1fc10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1fc20 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1fc30 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42         eMode = B
1fc40 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20  TALLOC_LE;.     
1fc50 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b     iNear = nFin;
1fc60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
1fc70 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
1fc80 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
1fc90 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
1fca0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
1fcb0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
1fcc0 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f  eePg, iNear, eMo
1fcd0 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  de);.        if(
1fce0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fcf0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
1fd00 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
1fd10 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1fd20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1fd30 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1fd40 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1fd50 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f       }while( bCo
1fd60 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e  mmit && iFreePg>
1fd70 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
1fd80 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
1fd90 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
1fda0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
1fdb0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
1fdc0 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
1fdd0 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
1fde0 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  bCommit);.      
1fdf0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1fe00 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
1fe10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fe20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fe30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1fe40 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f  }.  }..  if( bCo
1fe50 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  mmit==0 ){.    d
1fe60 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50  o {.      iLastP
1fe70 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  g--;.    }while(
1fe80 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e   iLastPg==PENDIN
1fe90 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1fea0 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47   || PTRMAP_ISPAG
1feb0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1fec0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  );.    pBt->bDoT
1fed0 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1fee0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c   pBt->nPage = iL
1fef0 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74  astPg;.  }.  ret
1ff00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1ff10 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ../*.** The data
1ff20 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74  base opened by t
1ff30 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1ff40 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  t is an auto-vac
1ff50 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  uum database.** 
1ff60 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73  nOrig pages in s
1ff70 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  ize containing n
1ff80 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e  Free free pages.
1ff90 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65   Return the expe
1ffa0 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  cted .** size of
1ffb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1ffc0 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67   pages following
1ffd0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1ffe0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
1fff0 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44  atic Pgno finalD
20000 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a  bSize(BtShared *
20010 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c  pBt, Pgno nOrig,
20020 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20   Pgno nFree){.  
20030 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20  int nEntry;     
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
20060 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d  ries on one ptrm
20070 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ap page */.  Pgn
20080 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20  o nPtrmap;      
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
200a0 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70  Number of PtrMap
200b0 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65   pages to be fre
200c0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69  ed */.  Pgno nFi
200d0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
200e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
200f0 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45  n value */..  nE
20100 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62  ntry = pBt->usab
20110 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72  leSize/5;.  nPtr
20120 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
20130 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
20140 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e  (pBt, nOrig)+nEn
20150 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e  try)/nEntry;.  n
20160 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
20170 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
20180 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
20190 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
201a0 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
201b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
201c0 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
201d0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52    }.  while( PTR
201e0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
201f0 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50  nFin) || nFin==P
20200 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20210 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
20220 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  n--;.  }..  retu
20230 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nFin;.}../*.*
20240 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
20250 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
20260 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
20270 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
20280 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
20290 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
202a0 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
202b0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
202c0 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
202d0 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
202e0 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
202f0 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
20300 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
20310 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
20320 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
20330 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
20340 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
20350 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
20360 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
20370 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
20380 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
20390 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
203a0 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
203b0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
203c0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
203d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
203e0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
203f0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
20400 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
20410 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
20420 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
20430 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
20440 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
20450 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
20460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
20470 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
20480 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72  Pgno nOrig = btr
20490 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
204a0 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  ;.    Pgno nFree
204b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
204c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
204d0 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  36]);.    Pgno n
204e0 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
204f0 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
20500 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  ree);..    if( n
20510 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20  Orig<nFin ){.   
20520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
20530 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
20540 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65   }else if( nFree
20550 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
20560 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
20570 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
20580 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20590 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
205a0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
205b0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
205c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63          rc = inc
205d0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
205e0 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29   nFin, nOrig, 0)
205f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20600 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20610 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
20620 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
20630 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
20640 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
20650 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20660 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20670 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
20680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
20690 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
206a0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
206b0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
206c0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
206d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
206e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
206f0 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
20700 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
20710 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
20720 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
20730 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61   committed for a
20740 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
20750 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
20760 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20770 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
20780 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
20790 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
207a0 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
207b0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
207c0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
207d0 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
207e0 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
207f0 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
20800 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
20810 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
20820 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
20830 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
20840 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
20850 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
20860 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
20870 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
20880 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20890 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
208a0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
208b0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
208c0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
208d0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
208e0 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28  r); )..  assert(
208f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
20900 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
20910 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
20920 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
20930 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
20940 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
20950 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
20960 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
20970 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
20980 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
20990 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
209a0 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75   after autovacuu
209b0 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ming */.    Pgno
209c0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   nFree;        /
209d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
209e0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
209f0 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20  t initially */. 
20a00 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20     Pgno iFree;  
20a10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
20a20 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65  t page to be fre
20a30 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ed */.    Pgno n
20a40 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20  Orig;        /* 
20a50 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65  Database size be
20a60 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a  fore freeing */.
20a70 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72  .    nOrig = btr
20a80 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
20a90 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ;.    if( PTRMAP
20aa0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
20ab0 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45  ig) || nOrig==PE
20ac0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
20ad0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
20ae0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
20af0 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
20b00 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69  database for whi
20b10 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67  ch the final pag
20b20 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  e.      ** is ei
20b30 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d  ther a pointer-m
20b40 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70  ap page or the p
20b50 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
20b60 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a  . If one.      *
20b70 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
20b80 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
20b90 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
20ba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
20bb0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20bc0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
20bd0 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
20be0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
20bf0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
20c00 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62    nFin = finalDb
20c10 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
20c20 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28   nFree);.    if(
20c30 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65   nFin>nOrig ) re
20c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20c50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66  UPT_BKPT;.    if
20c60 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a  ( nFin<nOrig ){.
20c70 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
20c80 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
20c90 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
20ca0 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
20cb0 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
20cc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
20cd0 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
20ce0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
20cf0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
20d00 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ee, 1);.    }.  
20d10 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
20d20 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
20d30 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
20d40 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
20d50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
20d60 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
20d70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
20d80 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
20d90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
20da0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
20db0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
20dc0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
20dd0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
20de0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20df0 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29  aData[28], nFin)
20e00 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f  ;.      pBt->bDo
20e10 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
20e20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
20e30 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20   nFin;.    }.   
20e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
20e60 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
20e70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
20e80 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
20e90 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref>=sqlite3Page
20ea0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
20eb0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
20ec0 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
20ed0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20ee0 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23  _AUTOVACUUM */.#
20ef0 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64   define setChild
20f00 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54  Ptrmaps(x) SQLIT
20f10 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
20f20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20f30 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
20f40 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
20f50 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
20f60 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
20f70 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
20f80 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
20f90 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
20fa0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
20fb0 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
20fc0 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
20fd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
20fe0 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
20ff0 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
21000 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
21010 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
21020 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
21030 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
21040 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
21050 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
21060 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
21070 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
21080 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
21090 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
210a0 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
210b0 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
210c0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
210d0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
210e0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
210f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
21100 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
21110 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
21120 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
21130 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
21140 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
21150 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
21160 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
21170 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
21180 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
21190 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
211a0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
211b0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
211c0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66  mmitPhaseTwo() f
211d0 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
211e0 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
211f0 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
21200 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
21210 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
21220 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
21230 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
21240 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
21250 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
21260 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
21270 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
21280 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
21290 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
212a0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
212b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
212c0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
212d0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
212e0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
212f0 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
21300 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
21310 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
21320 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
21330 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
21340 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
21350 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
21360 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
21370 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
21380 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
21390 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
213a0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
213b0 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
213c0 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
213d0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
213e0 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
213f0 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
21400 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
21410 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
21420 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
21430 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
21440 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
21450 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
21460 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
21470 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
21480 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
21490 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
214a0 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
214b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
214c0 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
214d0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
214e0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
214f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
21500 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
21510 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64  eEnter(p);.#ifnd
21520 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
21530 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
21540 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
21550 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
21560 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
21570 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
21580 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21590 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
215a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
215b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
215c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
215d0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44  .    if( pBt->bD
215e0 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  oTruncate ){.   
215f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
21600 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
21610 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e  ->pPager, pBt->n
21620 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
21630 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
21640 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
21650 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
21660 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  ger, zMaster, 0)
21670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
21680 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
21690 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
216a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
216b0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
216c0 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d  om both BtreeCom
216d0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e  mitPhaseTwo() an
216e0 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  d BtreeRollback(
216f0 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  ).** at the conc
21700 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e  lusion of a tran
21710 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
21720 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64  ic void btreeEnd
21730 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65  Transaction(Btre
21740 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
21750 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
21760 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21770 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
21780 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
21790 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
217a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
217b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
217c0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
217d0 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
217e0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
217f0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d  RANS_NONE && db-
21800 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a  >nVdbeRead>1 ){.
21810 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
21820 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65  are other active
21830 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
21840 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20   belong to this 
21850 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
21860 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64  handle, downgrad
21870 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e to a read-only
21880 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
21890 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  e other statemen
218a0 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74  ts.    ** may st
218b0 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66  ill be reading f
218c0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
218d0 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72  .  */.    downgr
218e0 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
218f0 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
21900 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
21910 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
21920 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
21930 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61  the handle had a
21940 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
21950 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
21960 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20  rement the .    
21970 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
21980 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
21990 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
219a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
219b0 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68  nt .    ** reach
219c0 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68  es 0, set the sh
219d0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
219e0 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
219f0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
21a00 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  d().    ** call 
21a10 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63  below will unloc
21a20 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f  k the pager.  */
21a30 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
21a40 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
21a50 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c  ){.      clearAl
21a60 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
21a70 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20  eLocks(p);.     
21a80 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
21a90 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  on--;.      if( 
21aa0 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
21ab0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
21ac0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21ad0 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
21ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21af0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63      /* Set the c
21b00 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
21b10 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
21b20 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
21b30 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  k the .    ** pa
21b40 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
21b50 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
21b60 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
21b70 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
21b80 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
21b90 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
21ba0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
21bb0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  used(pBt);.  }..
21bc0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
21bd0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  (p);.}../*.** Co
21be0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
21bf0 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
21c00 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
21c10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
21c20 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
21c30 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
21c40 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
21c50 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
21c60 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
21c70 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  ne() routine doe
21c80 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
21c90 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  e and should.** 
21ca0 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72  be invoked prior
21cb0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
21cc0 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
21cd0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
21ce0 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72  tPhaseOne().** r
21cf0 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74  outine did all t
21d00 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69  he work of writi
21d10 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ng information o
21d20 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66  ut to disk and f
21d30 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lushing the.** c
21d40 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20  ontents so that 
21d50 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e  they are written
21d60 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70   onto the disk p
21d70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69  latter.  All thi
21d80 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73  s.** routine has
21d90 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65   to do is delete
21da0 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20   or truncate or 
21db0 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20  zero the header 
21dc0 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f  in the.** the ro
21dd0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28  llback journal (
21de0 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65  which causes the
21df0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
21e00 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64  commit) and.** d
21e10 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  rop locks..**.**
21e20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e   Normally, if an
21e30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
21e40 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61  ile the pager la
21e50 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e  yer is attemptin
21e60 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a  g to .** finaliz
21e70 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
21e80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
21e90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
21ea0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e  urns an error an
21eb0 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c  d.** the upper l
21ec0 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70  ayer will attemp
21ed0 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f  t a rollback. Ho
21ee0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65  wever, if the se
21ef0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
21f00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65   is non-zero the
21f10 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72  n this b-tree tr
21f20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72  ansaction is par
21f30 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
21f40 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  e .** transactio
21f50 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  n. In this case,
21f60 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
21f70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
21f80 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20  n committed .** 
21f90 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d  (by deleting a m
21fa0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
21fb0 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  le) and the call
21fc0 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74  er will ignore t
21fd0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
21fe0 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53  s return code. S
21ff0 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72  o, even if an er
22000 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
22010 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a  e pager layer,.*
22020 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72  * reset the b-tr
22030 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72  ee objects inter
22040 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64  nal state to ind
22050 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77  icate that the w
22060 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rite.** transact
22070 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  ion has been clo
22080 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69  sed. This is qui
22090 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20  te safe, as the 
220a0 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a  pager will have.
220b0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20  ** transitioned 
220c0 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  to the error sta
220d0 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  te..**.** This w
220e0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
220f0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
22100 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22110 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
22120 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
22130 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
22140 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
22150 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
22160 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
22170 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c  aseTwo(Btree *p,
22180 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a   int bCleanup){.
22190 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
221a0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20  s==TRANS_NONE ) 
221b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
221c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
221d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
221e0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
221f0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
22200 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
22210 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
22220 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
22230 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
22240 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
22250 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
22260 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
22270 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
22280 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
22290 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
222a0 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72  t rc;.    BtShar
222b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
222c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
222d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
222e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
222f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
22300 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
22310 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
22320 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
22330 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
22340 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
22350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  !=SQLITE_OK && b
22360 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20  Cleanup==0 ){.  
22370 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22380 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
22390 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
223a0 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72  .    p->iDataVer
223b0 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70  sion--;  /* Comp
223c0 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65  ensate for pPage
223d0 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
223e0 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69  +; */.    pBt->i
223f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
22400 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
22410 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
22420 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
22430 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
22440 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
22450 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
22460 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22470 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
22480 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
22490 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
224a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
224b0 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
224c0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
224d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
224e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
224f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
22500 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
22510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22520 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22530 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
22540 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a  eTwo(p, 0);.  }.
22550 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
22560 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
22570 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
22580 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
22590 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
225a0 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
225b0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
225c0 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
225d0 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61  very cursor on a
225e0 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74  ny BtShared that
225f0 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
22600 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68  ences.  Or if th
22610 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
22620 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68   is set to 1, th
22630 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20  en only.** trip 
22640 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e  write cursors an
22650 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72  d leave read cur
22660 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  sors unchanged..
22670 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
22680 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  or is a candidat
22690 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c  e to be tripped,
226a0 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
226b0 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e  rs.** that belon
226c0 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  g to other datab
226d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
226e0 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
226f0 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65  e.** sharing the
22700 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
22710 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
22720 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
22730 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
22740 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68  ck occurs. If th
22750 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66  e writeOnly.** f
22760 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
22770 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72  n only write-cur
22780 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69  sors need be tri
22790 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79  pped - read-only
227a0 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65  .** cursors save
227b0 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70   their current p
227c0 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  ositions so that
227d0 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e   they may contin
227e0 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ue .** following
227f0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f   the rollback. O
22800 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  r, if writeOnly 
22810 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75  is false, all cu
22820 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72  rsors are .** tr
22830 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61  ipped. In genera
22840 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  l, writeOnly is 
22850 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61  false if the tra
22860 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a  nsaction being.*
22870 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f  * rolled back mo
22880 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
22890 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74  ase schema. In t
228a0 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20  his case b-tree 
228b0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61  root.** pages ma
228c0 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65  y be moved or de
228d0 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64  leted from the d
228e0 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68  atabase altogeth
228f0 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74  er, making.** it
22900 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64   unsafe for read
22910 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74   cursors to cont
22920 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  inue..**.** If t
22930 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
22940 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e  g is true and an
22950 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
22960 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20  tered while .** 
22970 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65  saving the curre
22980 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61  nt position of a
22990 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
229a0 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20  r, all cursors, 
229b0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  .** including al
229c0 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61  l read-cursors a
229d0 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a  re tripped..**.*
229e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
229f0 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
22a00 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20  ssful, or if an 
22a10 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
22a20 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63  le.** saving a c
22a30 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20  ursor position, 
22a40 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
22a50 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
22a60 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
22a70 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
22a80 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
22a90 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
22aa0 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
22ab0 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
22ac0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
22ad0 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d  rt( (writeOnly==
22ae0 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d  0 || writeOnly==
22af0 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65  1) && BTCF_Write
22b00 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
22b10 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73   pBtree ){.    s
22b20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
22b30 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f  (pBtree);.    fo
22b40 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
22b50 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
22b60 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
22b70 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26  if( writeOnly &&
22b80 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
22b90 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
22ba0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
22bb0 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
22bc0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
22bd0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
22be0 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
22bf0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75       rc = saveCu
22c00 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
22c10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
22c20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22c30 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
22c40 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d)sqlite3BtreeTr
22c50 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  ipAllCursors(pBt
22c60 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  ree, rc, 0);.   
22c70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22c80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22c90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
22ca0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
22cb0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
22cc0 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  or(p);.        p
22cd0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
22ce0 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20  R_FAULT;.       
22cf0 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
22d00 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  rrCode;.      }.
22d10 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
22d20 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
22d30 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (p);.    }.    s
22d40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
22d50 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
22d60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22d70 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 42 74 2d  .** Set the pBt-
22d80 3e 6e 50 61 67 65 20 66 69 65 6c 64 20 63 6f 72  >nPage field cor
22d90 72 65 63 74 6c 79 2c 20 61 63 63 6f 72 64 69 6e  rectly, accordin
22da0 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
22db0 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 74 68 65  .** state of the
22dc0 20 64 61 74 61 62 61 73 65 2e 20 20 41 73 73 75   database.  Assu
22dd0 6d 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  me pBt->pPage1 i
22de0 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74  s valid..*/.stat
22df0 69 63 20 76 6f 69 64 20 62 74 72 65 65 53 65 74  ic void btreeSet
22e00 4e 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  NPage(BtShared *
22e10 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  pBt, MemPage *pP
22e20 61 67 65 31 29 7b 0a 20 20 69 6e 74 20 6e 50 61  age1){.  int nPa
22e30 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
22e40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
22e50 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
22e60 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Page==0 );.  if(
22e70 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
22e80 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
22e90 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
22ea0 6e 50 61 67 65 29 3b 0a 20 20 74 65 73 74 63 61  nPage);.  testca
22eb0 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
22ec0 6e 50 61 67 65 20 29 3b 0a 20 20 70 42 74 2d 3e  nPage );.  pBt->
22ed0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 7d  nPage = nPage;.}
22ee0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
22ef0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22f00 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
22f10 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20  .** If tripCode 
22f20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
22f30 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69   then cursors wi
22f40 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
22f50 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20  d (tripped)..** 
22f60 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
22f70 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69  rs are tripped i
22f80 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74  f writeOnly is t
22f90 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73  rue but all curs
22fa0 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70  ors are.** tripp
22fb0 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
22fc0 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61  is false.  Any a
22fd0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a  ttempt to use.**
22fe0 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f   a tripped curso
22ff0 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  r will result in
23000 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
23010 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
23020 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
23030 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
23040 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
23050 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
23060 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
23070 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
23080 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
23090 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
230a0 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
230b0 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20  , int tripCode, 
230c0 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
230d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
230e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
230f0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
23100 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74  Page1;..  assert
23110 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c  ( writeOnly==1 |
23120 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29  | writeOnly==0 )
23130 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70  ;.  assert( trip
23140 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  Code==SQLITE_ABO
23150 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74  RT_ROLLBACK || t
23160 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
23170 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OK );.  sqlite3B
23180 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
23190 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
231a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
231b0 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
231c0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
231d0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
231e0 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79  ( rc ) writeOnly
231f0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
23200 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23210 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
23220 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  pCode ){.    int
23230 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
23240 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
23250 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77  s(p, tripCode, w
23260 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61  riteOnly);.    a
23270 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
23280 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e  E_OK || (writeOn
23290 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51  ly==0 && rc2==SQ
232a0 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20  LITE_OK) );.    
232b0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
232c0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
232d0 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
232e0 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
232f0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
23300 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
23310 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
23320 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
23330 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
23340 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
23350 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
23360 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
23370 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
23380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23390 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
233a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
233b0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
233c0 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
233d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
233e0 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
233f0 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
23400 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
23410 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
23420 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
23430 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
23440 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
23450 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
23460 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
23470 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
23480 7b 0a 20 20 20 20 20 20 62 74 72 65 65 53 65 74  {.      btreeSet
23490 4e 50 61 67 65 28 70 42 74 2c 20 70 50 61 67 65  NPage(pBt, pPage
234a0 31 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  1);.      releas
234b0 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
234c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
234d0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
234e0 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30  rsors(pBt, 1)==0
234f0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
23500 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
23510 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
23520 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
23530 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
23540 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
23550 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
23560 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
23570 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23580 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
23590 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
235a0 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
235b0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65  ansaction can be
235c0 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
235d0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
235e0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
235f0 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
23600 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
23610 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
23620 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
23630 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
23640 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
23650 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
23660 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
23670 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
23680 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
23690 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
236a0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
236b0 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
236c0 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
236d0 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
236e0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
236f0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
23700 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
23710 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
23720 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
23730 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
23740 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
23750 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
23760 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
23770 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
23780 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
23790 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
237a0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
237b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
237c0 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
237d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
237e0 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
237f0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
23800 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
23810 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
23820 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
23830 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
23840 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
23850 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
23860 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
23870 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
23880 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
23890 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
238a0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
238b0 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
238c0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
238d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
238e0 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
238f0 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
23900 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
23910 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
23920 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
23930 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
23940 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
23950 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
23960 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23970 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
23980 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
23990 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
239a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
239b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
239c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
239d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
239e0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
239f0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
23a00 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
23a10 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
23a20 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
23a30 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
23a40 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
23a50 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
23a60 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
23a70 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
23a80 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
23a90 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
23aa0 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
23ab0 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
23ac0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
23ad0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
23ae0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
23af0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
23b00 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
23b10 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
23b20 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
23b30 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
23b40 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
23b50 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
23b60 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
23b70 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
23b80 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
23b90 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
23ba0 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
23bb0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
23bc0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
23bd0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
23be0 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
23bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
23c00 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
23c10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
23c20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23c30 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
23c40 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
23c50 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
23c60 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
23c70 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
23c80 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
23c90 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
23ca0 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
23cb0 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
23cc0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
23cd0 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
23ce0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
23cf0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
23d00 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
23d10 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
23d20 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
23d30 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
23d40 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
23d50 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
23d60 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
23d70 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
23d80 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
23d90 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
23da0 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
23db0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
23dc0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
23dd0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
23de0 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
23df0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
23e00 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
23e10 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
23e20 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
23e30 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
23e40 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
23e50 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
23e60 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
23e70 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
23e80 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
23e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
23ea0 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
23eb0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
23ec0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
23ed0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
23ee0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
23ef0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
23f00 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
23f10 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
23f20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
23f30 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
23f40 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
23f50 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
23f60 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
23f70 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
23f80 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41  ;.    if( op==SA
23f90 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
23fa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23fb0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
23fc0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
23fd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
23ff0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24000 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
24010 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65  Pager, op, iSave
24020 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
24030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24040 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
24050 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
24060 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
24070 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
24080 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
24090 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
240a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
240b0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
240c0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
240d0 62 74 72 65 65 53 65 74 4e 50 61 67 65 28 70 42  btreeSetNPage(pB
240e0 74 2c 20 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  t, pBt->pPage1);
240f0 0a 0a 20 20 20 20 20 20 2f 2a 20 70 42 74 2d 3e  ..      /* pBt->
24100 6e 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 7a  nPage might be z
24110 65 72 6f 20 69 66 20 74 68 65 20 64 61 74 61 62  ero if the datab
24120 61 73 65 20 77 61 73 20 63 6f 72 72 75 70 74 20  ase was corrupt 
24130 77 68 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74  when .      ** t
24140 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
24150 61 73 20 73 74 61 72 74 65 64 2e 20 4f 74 68 65  as started. Othe
24160 72 77 69 73 65 2c 20 69 74 20 6d 75 73 74 20 62  rwise, it must b
24170 65 20 61 74 20 6c 65 61 73 74 20 31 2e 20 20 2a  e at least 1.  *
24180 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
24190 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 42  CORRUPT_DB || pB
241a0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
241b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
241c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
241d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
241e0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
241f0 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
24200 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
24210 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
24220 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
24230 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
24240 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
24250 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
24260 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
24270 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
24280 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
24290 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
242a0 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
242b0 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
242c0 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
242d0 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
242e0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
242f0 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
24300 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
24310 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
24320 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
24330 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
24340 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65  of wrFlag is cle
24350 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ar, then the cur
24360 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20  sor can only.** 
24370 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
24380 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52  ing.  If the BTR
24390 45 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20  EE_WRCSR bit is 
243a0 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  set, then the cu
243b0 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75  rsor.** can be u
243c0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
243d0 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69  or for writing i
243e0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
243f0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  ns for writing.*
24400 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  * are also met. 
24410 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
24420 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
24430 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
24440 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69  der.** for writi
24450 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64  ng to be allowed
24460 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
24470 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
24480 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
24490 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e  h wrFlag contain
244a0 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a  ing BTREE_WRCSR.
244b0 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
244c0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
244d0 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
244e0 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
244f0 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
24500 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
24510 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
24520 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
24530 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
24540 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
24550 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
24560 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
24570 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
24580 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
24590 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
245a0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
245b0 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
245c0 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
245d0 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
245e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
245f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
24600 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
24610 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
24620 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
24630 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
24640 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
24650 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
24660 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  ion..**.** The B
24670 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62  TREE_FORDELETE b
24680 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79  it of wrFlag may
24690 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73   optionally be s
246a0 65 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53  et if BTREE_WRCS
246b0 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66  R.** is set.  If
246c0 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65   FORDELETE is se
246d0 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e  t, that is a hin
246e0 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
246f0 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
24700 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c  this cursor will
24710 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f   only be used to
24720 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c   seek to and del
24730 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61  ete entries of a
24740 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61  n index.** as pa
24750 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44  rt of a larger D
24760 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  ELETE statement.
24770 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20    The FORDELETE 
24780 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  hint is not used
24790 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c   by.** this impl
247a0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74  ementation.  But
247b0 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63   in a hypothetic
247c0 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73  al alternative s
247d0 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a  torage engine .*
247e0 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78  * in which index
247f0 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74   entries are aut
24800 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
24810 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f  ed when correspo
24820 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72  nding table.** r
24830 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c  ows are deleted,
24840 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66   the FORDELETE f
24850 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68  lag is a hint th
24860 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20  at all SEEK and 
24870 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74  DELETE.** operat
24880 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72  ions on this cur
24890 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70  sor can be no-op
248a0 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f  s and all READ o
248b0 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a  perations can .*
248c0 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20  * return a null 
248d0 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78  row (2-bytes: 0x
248e0 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20  01 0x00)..**.** 
248f0 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
24900 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
24910 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
24920 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
24930 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
24940 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
24950 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
24960 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
24970 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
24980 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
24990 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
249a0 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
249b0 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
249c0 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
249d0 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
249e0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
249f0 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
24a00 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
24a10 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
24a20 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
24a30 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
24a40 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
24a70 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
24aa0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
24ab0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
24ac0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
24af0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
24b00 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
24b10 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
24b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24b30 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
24b40 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
24b50 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
24b60 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
24b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24b80 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
24b90 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
24ba0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24bb0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
24bc0 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
24bd0 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ree handle */.  
24be0 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20  BtCursor *pX;   
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e         /* Loopin
24c10 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c  g over other all
24c20 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61   cursors */..  a
24c30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
24c40 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
24c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
24c60 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20  Flag==0 .       
24c70 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45  || wrFlag==BTREE
24c80 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c  _WRCSR .       |
24c90 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45  | wrFlag==(BTREE
24ca0 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52  _WRCSR|BTREE_FOR
24cb0 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20  DELETE) .  );.. 
24cc0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
24cd0 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
24ce0 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
24cf0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
24d00 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
24d10 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
24d20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
24d30 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
24d40 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
24d50 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
24d60 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
24d70 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
24d80 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
24d90 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
24da0 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
24db0 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
24dc0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
24dd0 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
24de0 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c  eyInfo!=0, (wrFl
24df0 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73  ag?2:1)) );.  as
24e00 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
24e10 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
24e20 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
24e30 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
24e40 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
24e50 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
24e60 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
24e70 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
24e80 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
24e90 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
24ea0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
24eb0 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
24ec0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
24ed0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
24ee0 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
24ef0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  1->aData );.  as
24f00 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
24f10 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
24f20 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
24f30 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Y)==0 );..  if( 
24f40 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c  wrFlag ){.    al
24f50 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
24f60 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42  pBt);.    if( pB
24f70 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20  t->pTmpSpace==0 
24f80 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24f90 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
24fa0 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
24fb0 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
24fc0 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
24fd0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
24fe0 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
24ff0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
25000 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
25010 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
25020 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
25030 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
25040 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
25050 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
25060 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
25070 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
25080 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
25090 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
250a0 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
250b0 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
250c0 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
250d0 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
250e0 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
250f0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
25100 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72  r->curFlags = wr
25110 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74  Flag ? BTCF_Writ
25120 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75  eFlag : 0;.  pCu
25130 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
25140 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20   = wrFlag ? 0 : 
25150 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
25160 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  LY;.  /* If ther
25170 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
25180 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
25190 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
251a0 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20  n all such.  ** 
251b0 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68  cursors *must* h
251c0 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  ave the BTCF_Mul
251d0 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
251e0 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d  */.  for(pX=pBt-
251f0 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58  >pCursor; pX; pX
25200 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
25210 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f   if( pX->pgnoRoo
25220 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20  t==(Pgno)iTable 
25230 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72  ){.      pX->cur
25240 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
25250 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43  ltiple;.      pC
25260 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
25270 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
25280 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
25290 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
252a0 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43  ursor;.  pBt->pC
252b0 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
252c0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
252d0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
252e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
252f0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
25300 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
25310 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25340 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
25350 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
25360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25370 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
25380 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
25390 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
253a0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253c0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
253d0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
253e0 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
253f0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
25400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25410 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
25420 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
25430 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
25440 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
25470 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
25480 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
25490 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72  Table<1 ){.    r
254a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
254b0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
254c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
254d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
254e0 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
254f0 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
25500 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
25510 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
25520 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
25530 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25540 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25550 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
25560 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
25570 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
25580 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
25590 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
255a0 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
255b0 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
255c0 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
255d0 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
255e0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
255f0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
25600 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
25610 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
25620 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
25630 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
25640 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
25650 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
25660 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25670 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
25680 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
25690 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
256a0 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
256b0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
256c0 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
256d0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
256e0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
256f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
25700 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
25710 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
25720 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
25730 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
25740 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
25750 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
25760 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
25770 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
25780 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
25790 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
257a0 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
257b0 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
257c0 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
257d0 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
257e0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
257f0 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
25800 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25810 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
25820 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
25830 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
25840 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
25850 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54 5f 55  BTCURSOR_FIRST_U
25860 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  NINIT));.}../*.*
25870 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
25880 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
25890 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
258a0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
258b0 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
258c0 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
258d0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
258e0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
258f0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
25900 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
25910 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
25920 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
25930 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  e ){.    BtShare
25940 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
25950 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
25960 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
25970 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25980 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  Bt->pCursor!=0 )
25990 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
259a0 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a  Cursor==pCur ){.
259b0 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
259c0 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
259d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
259e0 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72     BtCursor *pPr
259f0 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ev = pBt->pCurso
25a00 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
25a10 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e       if( pPrev->
25a20 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20  pNext==pCur ){. 
25a30 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e           pPrev->
25a40 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
25a50 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ext;.          b
25a60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
25a70 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20          pPrev = 
25a80 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20  pPrev->pNext;.  
25a90 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41      }while( ALWA
25aa0 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20  YS(pPrev) );.   
25ab0 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65   }.    btreeRele
25ac0 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
25ad0 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c  s(pCur);.    unl
25ae0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
25af0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
25b00 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
25b10 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71  verflow);.    sq
25b20 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
25b30 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  >pKey);.    sqli
25b40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
25b50 74 72 65 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  tree);.    pCur-
25b60 3e 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  >pBtree = 0;.  }
25b70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25b80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
25b90 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
25ba0 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
25bb0 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
25bc0 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
25bd0 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
25be0 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
25bf0 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
25c00 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
25c10 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
25c20 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
25c30 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
25c40 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
25c50 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
25c60 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
25c70 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
25c80 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
25c90 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
25ca0 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
25cb0 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  l()..*/.#ifndef 
25cc0 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
25cd0 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61  int cellInfoEqua
25ce0 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43  l(CellInfo *a, C
25cf0 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20  ellInfo *b){.   
25d00 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d   if( a->nKey!=b-
25d10 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e 20 30  >nKey ) return 0
25d20 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70 50 61  ;.    if( a->pPa
25d30 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f  yload!=b->pPaylo
25d40 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ad ) return 0;. 
25d50 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f     if( a->nPaylo
25d60 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20  ad!=b->nPayload 
25d70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25d80 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62  if( a->nLocal!=b
25d90 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75 72  ->nLocal ) retur
25da0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e  n 0;.    if( a->
25db0 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20  nSize!=b->nSize 
25dc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25dd0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
25de0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25df0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
25e00 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
25e10 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
25e20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
25e30 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
25e40 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
25e50 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
25e60 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e  e, pCur->ix, &in
25e70 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
25e80 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 63   CORRUPT_DB || c
25e90 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e  ellInfoEqual(&in
25ea0 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  fo, &pCur->info)
25eb0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
25ec0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
25ed0 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
25ee0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
25ef0 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
25f00 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
25f10 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
25f20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
25f30 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
25f40 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
25f50 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
25f60 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
25f70 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72  pCur->pPage,pCur
25f80 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  ->ix,&pCur->info
25f90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25fa0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
25fb0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  Cur);.  }.}..#if
25fc0 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
25fd0 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
25fe0 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
25ff0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
26000 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
26010 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
26020 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
26030 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
26040 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
26050 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
26060 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
26070 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
26080 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
26090 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
260a0 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
260b0 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
260c0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
260d0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
260e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
260f0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
26100 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
26110 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
26120 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26130 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
26140 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
26150 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
26160 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e  eCursorIsValidNN
26170 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26180 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  {.  assert( pCur
26190 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
261a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
261b0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  RSOR_VALID;.}../
261c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
261d0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
261e0 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77  eger key or "row
261f0 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20  id" for a table 
26200 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72  btree..** This r
26210 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76  outine is only v
26220 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f  alid for a curso
26230 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69  r that is pointi
26240 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64  ng into a.** ord
26250 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72 65  inary table btre
26260 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  e.  If the curso
26270 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69  r points to an i
26280 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a  ndex btree or.**
26290 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   is invalid, the
262a0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20   result of this 
262b0 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66  routine is undef
262c0 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  ined..*/.i64 sql
262d0 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
262e0 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
262f0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
26300 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26310 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
26320 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
26330 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
26340 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26350 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20  >curIntKey );.  
26360 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
26370 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
26380 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a  ->info.nKey;.}..
26390 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
263a0 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
263b0 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  FUNC./*.** Retur
263c0 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  n the offset int
263d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
263e0 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ile for the star
263f0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c  t of the.** payl
26400 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74 68 65  oad to which the
26410 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
26420 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ing..*/.i64 sqli
26430 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28 42  te3BtreeOffset(B
26440 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
26450 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26460 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26480 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26490 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
264a0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
264b0 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 70  .  return (i64)p
264c0 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  Cur->pBt->pageSi
264d0 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70  ze*((i64)pCur->p
264e0 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20  Page->pgno - 1) 
264f0 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36 34 29  +.         (i64)
26500 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79  (pCur->info.pPay
26510 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61  load - pCur->pPa
26520 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65  ge->aData);.}.#e
26530 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
26540 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
26550 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _FUNC */../*.** 
26560 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
26570 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
26580 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
26590 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
265a0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
265b0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
265c0 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
265d0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
265e0 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
265f0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
26600 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
26610 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
26620 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
26630 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
26640 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
26650 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
26660 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
26670 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
26680 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
26690 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
266a0 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
266b0 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
266c0 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
266d0 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
266e0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
266f0 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
26700 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
26710 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
26720 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
26730 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
26740 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
26750 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
26760 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
26770 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
26780 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
26790 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
267a0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 75 70 70  ** Return an upp
267b0 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
267c0 73 69 7a 65 20 6f 66 20 61 6e 79 20 72 65 63 6f  size of any reco
267d0 72 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  rd for the table
267e0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
267f0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
26800 69 6e 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  into..**.** This
26810 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
26820 69 6f 6e 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ion.  Everything
26830 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
26840 20 69 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   if this.** rout
26850 69 6e 65 20 61 6c 77 61 79 73 20 72 65 74 75 72  ine always retur
26860 6e 73 20 32 31 34 37 34 38 33 36 34 37 20 28 77  ns 2147483647 (w
26870 68 69 63 68 20 69 73 20 74 68 65 20 6c 61 72 67  hich is the larg
26880 65 73 74 20 72 65 63 6f 72 64 0a 2a 2a 20 74 68  est record.** th
26890 61 74 20 53 51 4c 69 74 65 20 63 61 6e 20 68 61  at SQLite can ha
268a0 6e 64 6c 65 29 20 6f 72 20 6d 6f 72 65 2e 20 20  ndle) or more.  
268b0 42 75 74 20 72 65 74 75 72 6e 69 6e 67 20 61 20  But returning a 
268c0 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65 20 6d 69  smaller value mi
268d0 67 68 74 0a 2a 2a 20 70 72 65 76 65 6e 74 20 6c  ght.** prevent l
268e0 61 72 67 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  arge memory allo
268f0 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 74 72 79  cations when try
26900 69 6e 67 20 74 6f 20 69 6e 74 65 72 70 72 65 74  ing to interpret
26910 20 61 0a 2a 2a 20 63 6f 72 72 75 70 74 20 64 61   a.** corrupt da
26920 74 72 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  trabase..**.** T
26930 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
26940 6d 65 6e 74 61 74 69 6f 6e 20 6d 65 72 65 6c 79  mentation merely
26950 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a   returns the siz
26960 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  e of the underly
26970 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
26980 66 69 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  file..*/.sqlite3
26990 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74  _int64 sqlite3Bt
269a0 72 65 65 4d 61 78 52 65 63 6f 72 64 53 69 7a 65  reeMaxRecordSize
269b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
269c0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
269d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
269e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
269f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26a00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26a10 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74  return pCur->pBt
26a20 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71  ->pageSize * (sq
26a30 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 43 75 72  lite3_int64)pCur
26a40 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  ->pBt->nPage;.}.
26a50 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
26a60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
26a70 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
26a80 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
26a90 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
26aa0 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
26ab0 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
26ac0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
26ad0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
26ae0 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
26af0 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
26b00 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
26b10 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
26b20 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
26b30 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
26b40 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
26b50 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
26b60 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
26b70 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
26b80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
26b90 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
26ba0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
26bb0 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
26bc0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
26bd0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
26be0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
26bf0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
26c00 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
26c10 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
26c20 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
26c30 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
26c40 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
26c50 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
26c60 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
26c70 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
26c80 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
26c90 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
26ca0 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
26cb0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
26cc0 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
26cd0 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
26ce0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
26cf0 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
26d00 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
26d10 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
26d20 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
26d30 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
26d40 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
26d50 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
26d60 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
26d70 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
26d80 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
26d90 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
26da0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
26db0 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
26dc0 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
26dd0 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
26de0 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
26df0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
26e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
26e10 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
26e20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e40 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
26e50 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
26e60 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
26e70 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
26e80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
26e90 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
26ea0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
26eb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26ec0 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
26ed0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
26ee0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
26ef0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
26f00 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
26f10 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
26f20 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
26f30 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
26f40 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
26f50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26f60 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
26f70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
26f80 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
26f90 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
26fa0 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
26fb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
26fc0 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
26fd0 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
26fe0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
26ff0 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
27000 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
27010 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
27020 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
27030 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
27040 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
27050 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
27060 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
27070 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
27080 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
27090 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
270a0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
270b0 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
270c0 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
270d0 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
270e0 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
270f0 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
27100 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
27110 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
27120 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
27130 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
27140 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
27150 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
27160 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
27170 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
27180 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
27190 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
271a0 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
271b0 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
271c0 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
271d0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
271e0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
271f0 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
27200 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
27210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27220 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
27230 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
27240 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
27250 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
27260 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
27270 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
27280 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27290 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
272a0 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
272b0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
272c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
272d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
272e0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
272f0 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
27300 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20  , (ppPage==0) ? 
27310 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
27320 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73  LY : 0);.    ass
27330 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
27340 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
27350 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
27360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27370 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
27380 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
27390 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
273a0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
273b0 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
273c0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
273d0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
273e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
273f0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
27400 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
27410 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
27420 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
27430 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
27440 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
27450 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
27460 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
27470 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
27480 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
27490 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
274a0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
274b0 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
274c0 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
274d0 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
274e0 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
274f0 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
27500 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
27510 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
27520 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
27530 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
27540 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
27550 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
27560 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
27570 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
27580 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
27590 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
275a0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
275b0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
275c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
275d0 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
275e0 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
275f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27600 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
27610 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
27620 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
27630 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
27640 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
27650 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27660 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
27670 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
27680 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
27690 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
276a0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
276b0 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
276c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
276d0 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
276e0 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
276f0 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
27700 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
27710 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
27720 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
27730 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
27740 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
27750 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
27760 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
27770 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
27780 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
27790 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
277a0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
277b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
277c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
277d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
277e0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
277f0 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
27800 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
27810 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
27820 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
27830 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
27840 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
27850 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
27860 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
27870 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27880 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
27890 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
278a0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
278b0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
278c0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
278d0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
278e0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
278f0 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65  inting to. The e
27900 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  Op.** argument i
27910 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
27920 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
27930 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69    0: The operati
27940 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f  on is a read. Po
27950 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
27960 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
27970 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  1: The operation
27980 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70   is a write. Pop
27990 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
279a0 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  ow cache..**.** 
279b0 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
279c0 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
279d0 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
279e0 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
279f0 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
27a00 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
27a10 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
27a20 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
27a30 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
27a40 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
27a50 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
27a60 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
27a70 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
27a80 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
27a90 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
27aa0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
27ab0 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
27ac0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
27ad0 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68 69 73  ow pages.** this
27ae0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
27af0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
27b00 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75   and lazily popu
27b10 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72  late.** the over
27b20 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
27b30 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
27b40 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
27b50 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20   .** Subsequent 
27b60 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63  calls use this c
27b70 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65  ache to make see
27b80 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  king to the supp
27b90 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20  lied offset .** 
27ba0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a  more efficient..
27bb0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76  **.** Once an ov
27bc0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27bd0 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
27be0 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 75  allocated, it mu
27bf0 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
27c00 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
27c10 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
27c20 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
27c30 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
27c40 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
27c50 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
27c60 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
27c70 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
27c80 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
27c90 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
27ca0 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
27cb0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
27cc0 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
27cd0 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
27ce0 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
27cf0 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
27d00 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
27d10 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
27d20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
27d30 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
27d40 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
27d50 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
27d60 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
27d70 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
27d80 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
27d90 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
27da0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
27db0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
27dc0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
27dd0 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
27de0 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
27df0 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
27e00 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
27e10 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
27e20 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
27e30 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
27e40 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
27e50 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
27e60 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
27e70 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
27e80 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
27e90 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
27ea0 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
27eb0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
27ec0 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
27ed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
27ee0 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
27ef0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
27f00 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20  Cur->pPage;     
27f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
27f20 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
27f30 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
27f40 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
27f50 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
27f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
27f70 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
27f80 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66  elongs to */.#if
27f90 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
27fa0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
27fb0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
27fc0 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72  * const pBufStar
27fd0 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20 2f 2a  t = pBuf;     /*
27fe0 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67 69 6e   Start of origin
27ff0 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20 2a 2f  al out buffer */
28000 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
28010 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
28020 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20  sert( eOp==0 || 
28030 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eOp==1 );.  asse
28040 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28050 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
28060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28070 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  ->ix<pPage->nCel
28080 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
28090 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
280a0 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
280b0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
280c0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
280d0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
280e0 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
280f0 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69  t+amt <= pCur->i
28100 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
28110 0a 20 20 61 73 73 65 72 74 28 20 61 50 61 79 6c  .  assert( aPayl
28120 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  oad > pPage->aDa
28130 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75 70 74  ta );.  if( (upt
28140 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20 70 50  r)(aPayload - pP
28150 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20 28 70  age->aData) > (p
28160 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
28170 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
28180 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  al) ){.    /* Tr
28190 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
281a0 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
281b0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
281c0 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
281d0 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f  .    ** conditio
281e0 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72 65 61  nal above is rea
281f0 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26  lly:.    **    &
28200 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
28210 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
28220 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
28230 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20  >usableSize].   
28240 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63 61 73   ** but is recas
28250 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72 72 65  t into its curre
28260 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64  nt form to avoid
28270 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f   integer overflo
28280 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a  w problems.    *
28290 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
282a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
282b0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  (pPage);.  }..  
282c0 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
282d0 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
282e0 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
282f0 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
28300 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
28310 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
28320 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
28330 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
28340 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
28350 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
28360 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
28370 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
28380 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
28390 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
283a0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
283b0 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  et], pBuf, a, eO
283c0 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  p, pPage->pDbPag
283d0 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
283e0 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
283f0 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
28400 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
28410 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
28420 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
28430 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28440 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
28450 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
28460 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
28470 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
28480 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
28490 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
284a0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
284b0 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
284c0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
284d0 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
284e0 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20  fo.nLocal]);..  
284f0 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75    /* If the BtCu
28500 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
28510 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
28520 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
28530 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a  e it now..    **
28540 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
28550 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
28560 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
28570 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
28580 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
28590 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
285a0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
285b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
285c0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
285d0 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
285e0 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
285f0 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
28600 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
28610 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
28620 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
28630 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
28640 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
28650 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
28660 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
28670 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
28680 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
28690 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
286a0 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
286b0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
286c0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
286d0 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
286e0 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
286f0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d  Cur->aOverflow==
28700 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76 66  0.       || nOvf
28710 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28 50 67  l*(int)sizeof(Pg
28720 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d 61 6c  no) > sqlite3Mal
28730 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e 61 4f  locSize(pCur->aO
28740 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20 20 29  verflow).      )
28750 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
28760 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
28770 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
28780 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
28790 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
287a0 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
287b0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
287c0 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
287d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
287e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
287f0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
28800 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
28810 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
28820 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
28830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
28840 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65  emset(pCur->aOve
28850 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a  rflow, 0, nOvfl*
28860 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20  sizeof(Pgno));. 
28870 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
28880 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
28890 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  dOvfl;.    }else
288a0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
288b0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
288c0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
288d0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
288e0 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  d the.      ** e
288f0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
28900 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
28910 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
28920 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a  id, skip.      *
28930 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
28940 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
28950 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
28960 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
28970 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20  Size] ){.       
28980 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
28990 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
289a0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
289b0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
289c0 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  dx];.        off
289d0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
289e0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  flSize);.      }
289f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
28a00 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
28a10 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20  K && amt>0 );.  
28a20 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67    while( nextPag
28a30 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
28a40 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
28a50 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
28a60 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
28a70 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
28a80 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t( pCur->aOverfl
28a90 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20  ow[iIdx]==0.    
28aa0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75            || pCu
28ab0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
28ac0 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20  x]==nextPage.   
28ad0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
28ae0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
28af0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
28b00 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
28b10 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  ge;..      if( o
28b20 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
28b30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
28b40 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
28b50 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
28b60 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
28b70 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
28b80 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
28b90 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
28ba0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
28bb0 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
28bc0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
28bd0 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
28be0 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
28bf0 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
28c00 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
28c10 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
28c20 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
28c30 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
28c40 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
28c50 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
28c60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28c70 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28c80 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
28c90 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
28ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28cb0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
28cc0 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
28cd0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
28ce0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
28cf0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
28d00 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
28d10 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
28d20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28d30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
28d40 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
28d50 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
28d60 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
28d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
28d80 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
28d90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28da0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
28db0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
28dc0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
28dd0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
28de0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
28df0 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
28e00 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
28e10 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
28e20 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
28e30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28e40 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
28e50 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
28e60 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
28e70 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
28e80 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
28e90 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
28ea0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
28eb0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
28ec0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
28ed0 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
28ee0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
28ef0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28f00 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
28f10 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
28f20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
28f30 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
28f40 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
28f50 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
28f60 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
28f70 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
28f80 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69 72  there are no dir
28f90 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
28fa0 70 61 67 65 2d 63 61 63 68 65 0a 20 20 20 20 20  page-cache.     
28fb0 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20 64     **   4) the d
28fc0 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
28fd0 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
28fe0 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
28ff0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
29000 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20  he WAL file.    
29010 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20 6c      **   6) at l
29020 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76  east 4 bytes hav
29030 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
29040 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ead into the out
29050 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20  put buffer .    
29060 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29070 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
29080 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
29090 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
290a0 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
290b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
290c0 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
290d0 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
290e0 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
290f0 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
29100 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
29110 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
29120 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
29130 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
29140 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29150 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20    if( eOp==0    
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29180 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
29190 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
291a0 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
291e0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
291f0 61 67 65 72 44 69 72 65 63 74 52 65 61 64 4f 6b  agerDirectReadOk
29200 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
29210 78 74 50 61 67 65 29 20 20 20 20 2f 2a 20 28 33  xtPage)    /* (3
29220 2c 34 2c 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  ,4,5) */.       
29230 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
29240 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a          /* (6) *
29270 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
29280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
29290 69 6c 65 20 2a 66 64 20 3d 20 73 71 6c 69 74 65  ile *fd = sqlite
292a0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
292b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
292c0 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a     u8 aSave[4];.
292d0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57            u8 *aW
292e0 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d  rite = &pBuf[-4]
292f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
29300 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66  rt( aWrite>=pBuf
29310 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20  Start );        
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a   /* due to (6) *
29340 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
29350 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
29360 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
29370 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
29380 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
29390 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
293a0 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
293b0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
293c0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
293d0 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
293e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
293f0 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
29400 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
29410 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
29420 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
29430 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
29440 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29450 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
29460 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
29470 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
29480 20 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d            (eOp==
29490 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
294a0 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20  ADONLY : 0).    
294b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
294c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
294d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
294e0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
294f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
29500 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
29510 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
29520 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
29530 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
29540 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
29550 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
29560 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
29570 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
29580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
29590 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
295a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
295b0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
295c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
295d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
295e0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
295f0 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72    if( amt==0 ) r
29600 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29610 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
29620 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
29630 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
29640 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iIdx++;.    }. 
29650 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
29660 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
29670 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66   ){.    /* Overf
29680 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70  low chain ends p
29690 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20  rematurely */.  
296a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
296b0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
296c0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
296d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
296e0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
296f0 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20  payload for the 
29700 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68 61  row at which tha
29710 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
29720 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
29730 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62  inting.  "amt" b
29740 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
29750 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42  nsferred into pB
29760 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
29770 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
29780 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
29790 20 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69   pCur can be poi
297a0 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20  nting to either 
297b0 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e  a table or an in
297c0 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49  dex b-tree..** I
297d0 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  f pointing to a 
297e0 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65  table btree, the
297f0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65  n the content se
29800 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20  ction is read.  
29810 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f  If.** pCur is po
29820 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64  inting to an ind
29830 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74  ex b-tree then t
29840 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69  he key section i
29850 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s read..**.** Fo
29860 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  r sqlite3BtreePa
29870 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c  yload(), the cal
29880 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
29890 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
298a0 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
298b0 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74  lid row in the t
298c0 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74  able.  For sqlit
298d0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68  e3BtreePayloadCh
298e0 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20  ecked(), the.** 
298f0 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20  cursor might be 
29900 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74  invalid or might
29910 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73 74   need to be rest
29920 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ored before bein
29930 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  g read..**.** Re
29940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
29950 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
29960 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
29970 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
29980 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
29990 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
299a0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
299b0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
299c0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
299d0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
299e0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
299f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29a00 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
29a10 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
29a20 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
29a30 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
29a40 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29a50 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29a60 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29a70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
29a80 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
29a90 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
29aa0 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72  t( pCur->ix<pCur
29ab0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
29ac0 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
29ad0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
29ae0 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
29af0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
29b00 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
29b10 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73  his variant of s
29b20 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
29b30 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20  ad() works even 
29b40 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  if the cursor ha
29b50 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  s not.** in the 
29b60 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61  CURSOR_VALID sta
29b70 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  te.  It is only 
29b80 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  used by the sqli
29b90 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a  te3_blob_read().
29ba0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ** interface..*/
29bb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29bc0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74  OMIT_INCRBLOB.st
29bd0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
29be0 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50  LINE int accessP
29bf0 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20  ayloadChecked(. 
29c00 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
29c10 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20  .  u32 offset,. 
29c20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64   u32 amt,.  void
29c30 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20   *pBuf.){.  int 
29c40 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d  rc;.  if ( pCur-
29c50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29c60 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
29c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
29c80 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  RT;.  }.  assert
29c90 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
29ca0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
29cb0 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72  rc = btreeRestor
29cc0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
29cd0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
29ce0 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73  rc ? rc : access
29cf0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
29d00 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
29d10 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
29d20 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68  e3BtreePayloadCh
29d30 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a  ecked(BtCursor *
29d40 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
29d50 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
29d60 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43  *pBuf){.  if( pC
29d70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29d80 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
29d90 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29da0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29db0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   );.    return a
29dc0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
29dd0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
29de0 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  pBuf, 0);.  }els
29df0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63  e{.    return ac
29e00 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b  cessPayloadCheck
29e10 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ed(pCur, offset,
29e20 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d   amt, pBuf);.  }
29e30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
29e40 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
29e50 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  B */../*.** Retu
29e60 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
29e70 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
29e80 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
29e90 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
29ea0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
29eb0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
29ec0 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
29ed0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
29ee0 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e  ** the key if in
29ef0 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67  dex btrees (pPag
29f00 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e  e->intKey==0) an
29f10 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f  d is the data fo
29f20 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65  r.** table btree
29f30 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
29f40 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72  ==1). The number
29f50 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
29f60 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61  ilable.** key/da
29f70 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ta is written in
29f80 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
29f90 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
29fa0 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e   value.** return
29fb0 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ed will not be a
29fc0 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
29fd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29fe0 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
29ff0 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
2a000 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
2a010 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
2a020 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
2a030 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
2a040 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
2a050 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
2a060 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
2a070 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
2a080 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
2a090 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
2a0a0 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
2a0b0 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
2a0c0 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
2a0d0 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
2a0e0 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
2a0f0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
2a100 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
2a110 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
2a120 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
2a130 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
2a140 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
2a150 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
2a160 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
2a170 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
2a180 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
2a190 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
2a1a0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
2a1b0 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
2a1c0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
2a1d0 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
2a1e0 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
2a1f0 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
2a200 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
2a210 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
2a220 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63  const void *fetc
2a230 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
2a240 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2a250 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
2a260 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
2a270 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
2a280 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20  32 *pAmt        
2a290 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2a2a0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
2a2b0 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
2a2c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b  */.){.  int amt;
2a2d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
2a2e0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
2a2f0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  e>=0 && pCur->pP
2a300 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
2a310 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a320 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2a330 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2a340 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2a350 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2a360 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2a370 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2a380 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2a390 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
2a3a0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2a3b0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
2a3c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2a3d0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2a3e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2a3f0 6f 61 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d  oad>pCur->pPage-
2a400 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50  >aData || CORRUP
2a410 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
2a420 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
2a430 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67  yload<pCur->pPag
2a440 65 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f  e->aDataEnd ||CO
2a450 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74  RRUPT_DB);.  amt
2a460 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
2a470 6f 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e  ocal;.  if( amt>
2a480 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67  (int)(pCur->pPag
2a490 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43  e->aDataEnd - pC
2a4a0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2a4b0 64 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  d) ){.    /* The
2a4c0 72 65 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65  re is too little
2a4d0 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
2a4e0 67 65 20 66 6f 72 20 74 68 65 20 65 78 70 65 63  ge for the expec
2a4f0 74 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a  ted amount.    *
2a500 2a 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65  * of local conte
2a510 6e 74 2e 20 44 61 74 61 62 61 73 65 20 6d 75 73  nt. Database mus
2a520 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
2a530 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
2a540 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61  RUPT_DB );.    a
2a550 6d 74 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74  mt = MAX(0, (int
2a560 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  )(pCur->pPage->a
2a570 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e  DataEnd - pCur->
2a580 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b  info.pPayload));
2a590 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28  .  }.  *pAmt = (
2a5a0 75 33 32 29 61 6d 74 3b 0a 20 20 72 65 74 75 72  u32)amt;.  retur
2a5b0 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69  n (void*)pCur->i
2a5c0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a  nfo.pPayload;.}.
2a5d0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
2a5e0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
2a5f0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
2a600 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
2a610 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
2a620 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
2a630 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
2a640 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
2a650 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
2a660 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
2a670 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
2a680 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
2a690 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
2a6a0 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
2a6b0 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
2a6c0 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
2a6d0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
2a6e0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
2a6f0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
2a700 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
2a710 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
2a720 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
2a730 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
2a740 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
2a750 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
2a760 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
2a770 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
2a780 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
2a790 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
2a7a0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
2a7b0 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
2a7c0 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
2a7d0 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
2a7e0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2a7f0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
2a800 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
2a810 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
2a820 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79  *sqlite3BtreePay
2a830 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73  loadFetch(BtCurs
2a840 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
2a850 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
2a860 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
2a870 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
2a880 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2a890 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
2a8a0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
2a8b0 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
2a8c0 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
2a8d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2a8e0 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
2a8f0 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
2a900 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2a910 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
2a920 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
2a930 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
2a940 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
2a950 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
2a960 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
2a970 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
2a980 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
2a990 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
2a9a0 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
2a9b0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
2a9c0 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
2a9d0 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
2a9e0 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
2a9f0 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
2aa00 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
2aa10 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74  2 newPgno){.  Bt
2aa20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
2aa30 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
2aa40 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2aa50 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2aa60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2aa70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2aa80 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2aa90 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
2aaa0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
2aab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2aac0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
2aad0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2aae0 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
2aaf0 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
2ab00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2ab10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
2ab20 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2ab30 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2ab40 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2ab50 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2ab60 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2ab70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2ab80 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72  r->iPage] = pCur
2ab90 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70  ->ix;.  pCur->ap
2aba0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2abb0 5d 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  ] = pCur->pPage;
2abc0 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b  .  pCur->ix = 0;
2abd0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
2abe0 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e  ;.  return getAn
2abf0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
2ac00 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70  ewPgno, &pCur->p
2ac10 50 61 67 65 2c 20 70 43 75 72 2c 20 70 43 75 72  Page, pCur, pCur
2ac20 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
2ac30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2ac40 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
2ac50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
2ac60 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
2ac70 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
2ac80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
2ac90 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
2aca0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
2acb0 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
2acc0 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
2acd0 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
2ace0 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
2acf0 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
2ad00 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
2ad10 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
2ad20 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
2ad30 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
2ad40 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
2ad50 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
2ad60 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
2ad70 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
2ad80 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
2ad90 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
2ada0 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
2adb0 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50  d){.  if( CORRUP
2adc0 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20  T_DB ) return;  
2add0 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
2ade0 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d  s tested below m
2adf0 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65  ight not be true
2ae00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2ae20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  in a corrupt dat
2ae30 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  abase */.  asser
2ae40 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
2ae50 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
2ae60 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
2ae70 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
2ae80 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
2ae90 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
2aea0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
2aeb0 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
2aec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2aed0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
2aee0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
2aef0 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
2af00 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
2af10 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
2af20 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
2af30 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
2af40 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2af50 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
2af60 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
2af70 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
2af80 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
2af90 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2afa0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
2afb0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
2afc0 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
2afd0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
2afe0 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
2aff0 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
2b000 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
2b010 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
2b020 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
2b030 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
2b040 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
2b050 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
2b060 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2b070 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66    MemPage *pLeaf
2b080 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2b090 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2b0a0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b0b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b0c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b0d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b0e0 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
2b0f0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2b100 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65   );.  assertPare
2b110 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
2b120 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b130 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
2b140 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2b150 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
2b160 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e  pCur->pPage->pgn
2b170 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73  o.  );.  testcas
2b180 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2b190 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
2b1a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b1b0 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
2b1c0 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ll );.  pCur->in
2b1d0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2b1e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2b1f0 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2b200 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2b210 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  l);.  pCur->ix =
2b220 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b230 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70  r->iPage-1];.  p
2b240 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 70 50 61  Leaf = pCur->pPa
2b250 67 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67  ge;.  pCur->pPag
2b260 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2b270 5b 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  [--pCur->iPage];
2b280 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  .  releasePageNo
2b290 74 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a  tNull(pLeaf);.}.
2b2a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2b2b0 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
2b2c0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
2b2d0 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73   of its b-tree s
2b2e0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
2b2f0 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
2b300 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
2b310 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63  page, then the c
2b320 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
2b330 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68  o point.** to th
2b340 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  e virtual root p
2b350 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74  age instead of t
2b360 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
2b370 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73  age. A table has
2b380 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f   a.** virtual ro
2b390 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65  ot page when the
2b3a0 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
2b3b0 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
2b3c0 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69  lls and a .** si
2b3d0 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e  ngle child page.
2b3e0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
2b3f0 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74  appen with the t
2b400 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
2b410 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age 1..**.** If 
2b420 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  the b-tree struc
2b430 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ture is empty, t
2b440 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
2b450 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55  is set to .** CU
2b460 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64  RSOR_INVALID and
2b470 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2b480 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50  turns SQLITE_EMP
2b490 54 59 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  TY. Otherwise,.*
2b4a0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
2b4b0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
2b4c0 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6c  the first cell l
2b4d0 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
2b4e0 6f 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74 75 61  ot.** (or virtua
2b4f0 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
2b500 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
2b510 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
2b520 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
2b530 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
2b540 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
2b550 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
2b560 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2b570 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
2b580 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
2b590 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
2b5a0 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
2b5b0 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
2b5c0 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
2b5d0 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
2b5e0 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
2b5f0 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
2b600 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
2b610 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
2b620 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
2b630 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
2b640 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
2b650 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
2b660 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
2b670 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
2b680 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
2b690 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
2b6a0 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
2b6b0 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
2b6c0 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
2b6d0 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
2b6e0 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
2b6f0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
2b700 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2b710 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
2b720 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
2b730 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2b740 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2b750 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2b760 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
2b770 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
2b780 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2b790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2b7a0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
2b7b0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2b7c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2b7d0 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
2b7e0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2b7f0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
2b800 43 75 72 2d 3e 65 53 74 61 74 65 20 3c 20 43 55  Cur->eState < CU
2b810 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2b820 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c   || pCur->iPage<
2b830 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b840 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20  Cur->pgnoRoot>0 
2b850 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30  || pCur->iPage<0
2b860 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d   );..  if( pCur-
2b870 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
2b880 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2b890 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2b8a0 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
2b8b0 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 20  r->pPage);.     
2b8c0 20 77 68 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e   while( --pCur->
2b8d0 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  iPage ){.       
2b8e0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2b8f0 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
2b900 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
2b910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2b920 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72  ur->pPage = pCur
2b930 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20  ->apPage[0];.   
2b940 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69     goto skip_ini
2b950 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
2b960 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
2b970 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
2b980 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2b990 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2b9a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2b9b0 4d 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  MPTY;.  }else{. 
2b9c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b9d0 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a  >iPage==(-1) );.
2b9e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
2b9f0 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
2ba00 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
2ba10 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2ba20 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
2ba30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2ba40 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2ba50 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
2ba60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ba70 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
2ba80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2ba90 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
2baa0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
2bab0 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41   }.    rc = getA
2bac0 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d  ndInitPage(pCur-
2bad0 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43  >pBtree->pBt, pC
2bae0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
2baf0 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20  Cur->pPage,.    
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb10 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72      0, pCur->cur
2bb20 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20  PagerFlags);.   
2bb30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2bb40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
2bb50 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2bb60 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2bb70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2bb80 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
2bb90 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
2bba0 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75  >curIntKey = pCu
2bbb0 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
2bbc0 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
2bbd0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
2bbe0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
2bbf0 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
2bc00 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ot );..  /* If p
2bc10 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
2bc20 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
2bc30 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
2bc40 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
2bc50 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64  or.  ** expected
2bc60 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
2bc70 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
2bc80 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
2bc90 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e  eyInfo is.  ** N
2bca0 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
2bcb0 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
2bcc0 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
2bcd0 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
2bce0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  .  ** return an 
2bcf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
2bd00 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rror. .  **.  **
2bd10 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
2bd20 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75  s of SQLite assu
2bd30 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65  med that this te
2bd40 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69  st could not fai
2bd50 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f  l.  ** if the ro
2bd60 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65  ot page was alre
2bd70 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20  ady loaded when 
2bd80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
2bd90 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20  s called (i.e.. 
2bda0 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61   ** if pCur->iPa
2bdb0 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73  ge>=0). But this
2bdc0 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68   is not so if th
2bdd0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2bde0 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e  rrupted .  ** in
2bdf0 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
2be00 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c   page pRoot is l
2be10 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63  inked into a sec
2be20 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ond b-tree table
2be30 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66   .  ** (or the f
2be40 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20  reelist).  */.  
2be50 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
2be60 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f  ntKey==1 || pRoo
2be70 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  t->intKey==0 );.
2be80 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49    if( pRoot->isI
2be90 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nit==0 || (pCur-
2bea0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
2beb0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Root->intKey ){.
2bec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bed0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
2bee0 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d  Cur->pPage);.  }
2bef0 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20  ..skip_init:  . 
2bf00 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20   pCur->ix = 0;. 
2bf10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2bf20 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2bf30 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2bf40 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2bf50 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2bf60 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f  idOvfl);..  pRoo
2bf70 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  t = pCur->pPage;
2bf80 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
2bf90 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
2bfa0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2bfb0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
2bfc0 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
2bfd0 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
2bfe0 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
2bff0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
2c000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2c010 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2c020 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
2c030 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
2c040 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
2c050 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2c060 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2c070 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
2c080 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2c090 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
2c0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
2c0b0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2c0c0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  _INVALID;.    rc
2c0d0 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b   = SQLITE_EMPTY;
2c0e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c0f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2c100 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
2c110 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
2c120 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
2c130 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
2c140 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
2c150 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2c160 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
2c170 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
2c180 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
2c190 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
2c1a0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
2c1b0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
2c1c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2c1d0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
2c1e0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2c1f0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
2c200 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c210 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2c220 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2c230 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2c240 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2c250 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2c260 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2c270 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
2c280 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
2c290 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2c2a0 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
2c2b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2c2c0 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2c2d0 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
2c2e0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2c2f0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29  Page, pCur->ix))
2c300 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2c310 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
2c320 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2c330 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
2c340 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2c350 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
2c360 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
2c370 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
2c380 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
2c390 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2c3a0 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
2c3b0 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
2c3c0 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
2c3d0 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
2c3e0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
2c3f0 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
2c400 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
2c410 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
2c420 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
2c430 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
2c440 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
2c450 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
2c460 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
2c470 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
2c480 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
2c490 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
2c4a0 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
2c4b0 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
2c4c0 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
2c4d0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
2c4e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2c4f0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
2c500 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2c510 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
2c520 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c530 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
2c540 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
2c550 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2c560 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2c570 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c580 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2c590 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2c5a0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
2c5b0 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
2c5c0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2c5d0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2c5e0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2c5f0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
2c600 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e  r->ix = pPage->n
2c610 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
2c620 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2c630 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
2c640 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2c650 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d    }.  pCur->ix =
2c660 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2c670 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2c680 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2c690 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2c6a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2c6b0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
2c6c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2c6d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
2c6e0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2c6f0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2c700 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2c710 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2c720 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
2c730 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
2c740 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
2c750 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
2c760 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
2c770 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2c780 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2c790 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2c7a0 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
2c7b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2c7c0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2c7d0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
2c7e0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2c7f0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2c800 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2c810 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2c820 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2c830 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
2c840 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2c850 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c860 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2c870 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
2c880 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70  Cell>0 );.    *p
2c890 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Res = 0;.    rc 
2c8a0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
2c8b0 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20  (pCur);.  }else 
2c8c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
2c8d0 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65  MPTY ){.    asse
2c8e0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2c8f0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70  ot==0 || pCur->p
2c900 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2c910 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  ;.    *pRes = 1;
2c920 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c930 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
2c940 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2c950 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2c960 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2c970 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2c980 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2c990 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2c9a0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2c9b0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2c9c0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2c9d0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2c9e0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2c9f0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2ca00 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2ca10 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2ca20 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2ca30 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2ca40 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2ca50 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2ca60 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ca70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ca80 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2ca90 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2caa0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2cab0 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2cac0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2cad0 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2cae0 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2caf0 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2cb00 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2cb10 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2cb20 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2cb30 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2cb40 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2cb50 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2cb60 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2cb70 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2cb80 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2cb90 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2cba0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2cbb0 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2cbc0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2cbd0 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2cbe0 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2cbf0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2cc00 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2cc10 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2cc20 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2cc30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2cc40 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d  ix==pCur->pPage-
2cc50 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
2cc60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2cc70 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  age->leaf );.#en
2cc80 64 69 66 0a 20 20 20 20 2a 70 52 65 73 20 3d 20  dif.    *pRes = 
2cc90 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
2cca0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2ccb0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2ccc0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2ccd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cce0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ccf0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2cd00 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52 65  ALID );.    *pRe
2cd10 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
2cd20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2cd30 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2cd40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2cd50 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2cd60 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2cd70 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ast;.    }else{.
2cd80 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2cd90 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74  lags &= ~BTCF_At
2cda0 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Last;.    }.  }e
2cdb0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2cdc0 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20  TE_EMPTY ){.    
2cdd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2cde0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2cdf0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
2ce00 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
2ce10 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
2ce20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
2ce30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2ce40 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2ce50 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2ce60 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2ce70 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2ce80 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2ce90 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2cea0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2ceb0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2cec0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2ced0 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2cee0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2cef0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2cf00 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2cf10 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2cf20 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2cf30 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2cf40 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2cf50 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2cf60 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2cf70 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2cf80 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2cf90 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2cfa0 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2cfb0 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2cfc0 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2cfd0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2cfe0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2cff0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2d000 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2d010 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2d020 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2d030 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2d040 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2d050 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2d060 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2d070 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2d080 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2d090 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2d0a0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2d0b0 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2d0c0 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2d0d0 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2d0e0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2d0f0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2d100 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2d110 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2d120 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2d130 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2d140 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2d150 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2d160 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2d170 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d190 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2d1a0 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2d1b0 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2d1c0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2d1d0 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2d1e0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2d1f0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2d200 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2d210 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2d220 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2d230 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2d240 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2d250 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2d260 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2d270 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2d280 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2d290 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2d2a0 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2d2b0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65  ..**.** For inde
2d2c0 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49  x tables, the pI
2d2d0 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69  dxKey->eqSeen fi
2d2e0 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20  eld is set to 1 
2d2f0 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73  if there.** exis
2d300 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ts an entry in t
2d310 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78  he table that ex
2d320 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49  actly matches pI
2d330 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20  dxKey.  .*/.int 
2d340 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2d350 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
2d360 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2d370 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2d380 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
2d390 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
2d3a0 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
2d3b0 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
2d3c0 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
2d3d0 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
2d3e0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2d3f0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
2d400 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
2d410 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
2d420 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
2d430 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
2d440 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
2d450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2d460 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
2d470 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
2d480 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
2d490 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
2d4a0 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
2d4b0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2d4c0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2d4d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d4e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2d4f0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2d500 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2d510 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2d520 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2d530 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2d540 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  fo==0) );.  asse
2d550 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2d560 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
2d570 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  | (pIdxKey==0)==
2d580 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  (pCur->curIntKey
2d590 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  !=0) );..  /* If
2d5a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2d5b0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
2d5c0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
2d5d0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
2d5e0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
2d5f0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
2d600 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2d610 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
2d620 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20  IdxKey==0.   && 
2d630 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2d640 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
2d650 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2d660 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
2d670 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  =0.  ){.    if( 
2d680 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2d690 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2d6a0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2d6b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d6c0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2d6d0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2d6e0 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2d6f0 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
2d700 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2d710 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ast)!=0 ){.     
2d720 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2d730 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2d740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2d750 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2d760 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 69   requested key i
2d770 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  s one more than 
2d780 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79  the previous key
2d790 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
2d7a0 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72 65  try to get there
2d7b0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74   using sqlite3Bt
2d7c0 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65 72  reeNext() rather
2d7d0 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20   than a full.   
2d7e0 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61     ** binary sea
2d7f0 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rch.  This is an
2d800 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
2d810 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74  ly.  The correct
2d820 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a   answer.      **
2d830 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e   is still obtain
2d840 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73 20  ed without this 
2d850 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74  case, only a lit
2d860 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79  tle more slowely
2d870 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2d880 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d  ur->info.nKey+1=
2d890 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2d8a0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2d8b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d8c0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2d8d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2d8e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d8f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  ){.          get
2d900 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
2d910 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2d920 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
2d930 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2d940 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d950 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2d960 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2d970 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d980 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
2d990 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2d9a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d9b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2d9c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2d9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d9e0 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  }..  if( pIdxKey
2d9f0 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43   ){.    xRecordC
2da00 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33  ompare = sqlite3
2da10 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
2da20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49  pIdxKey);.    pI
2da30 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d  dxKey->errCode =
2da40 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2da50 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2da60 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
2da70 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
2da80 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
2da90 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2daa0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
2dab0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2dac0 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
2dad0 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
2dae0 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
2daf0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
2db00 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2db10 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2db20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2db30 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 20 20  _EMPTY ){.      
2db40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2db50 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2db60 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
2db70 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
2db80 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
2db90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2dba0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2dbb0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2dbc0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
2dbd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2dbe0 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ->pPage->isInit 
2dbf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2dc00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2dc10 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2dc20 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2dc30 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20  ->nCell > 0 );. 
2dc40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2dc50 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Page==0 || pCur-
2dc60 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
2dc70 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey==pCur->curInt
2dc80 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2dc90 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2dca0 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
2dcb0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
2dcc0 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
2dcd0 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
2dce0 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
2dcf0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2dd00 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20 2a 70  pPage;.    u8 *p
2dd10 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dd30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
2dd40 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
2dd50 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50  ge */..    /* pP
2dd60 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
2dd70 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
2dd80 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
2dd90 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
2dda0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
2ddb0 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
2ddc0 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
2ddd0 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
2dde0 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
2ddf0 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
2de00 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
2de10 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
2de20 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
2de30 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
2de40 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
2de50 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
2de60 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
2de70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
2de80 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
2de90 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
2dea0 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
2deb0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
2dec0 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
2ded0 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
2dee0 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
2def0 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
2df00 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
2df10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2df20 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
2df30 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2df40 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
2df50 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
2df60 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
2df70 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2df80 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69    assert( biasRi
2df90 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69  ght==0 || biasRi
2dfa0 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64  ght==1 );.    id
2dfb0 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73  x = upr>>(1-bias
2dfc0 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d  Right); /* idx =
2dfd0 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72   biasRight ? upr
2dfe0 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   : (lwr+upr)/2; 
2dff0 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20  */.    pCur->ix 
2e000 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2e010 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  if( xRecordCompa
2e020 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  re==0 ){.      f
2e030 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2e040 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
2e050 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2e060 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2e070 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20  age, idx);.     
2e080 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2e090 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
2e0a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38        while( 0x8
2e0b0 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20  0 <= *(pCell++) 
2e0c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2e0d0 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d  f( pCell>=pPage-
2e0e0 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20  >aDataEnd ){.   
2e0f0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2e100 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2e110 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
2e120 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e140 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
2e150 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
2e160 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
2e170 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
2e180 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2e190 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2e1a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2e1b0 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2e1c0 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  -1; break; }.   
2e1d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
2e1e0 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
2e1f0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
2e200 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
2e210 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2e220 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b  { c = +1; break;
2e230 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2e240 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2e250 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  rt( nCellKey==in
2e260 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
2e270 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2e280 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2e290 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e2a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2e2b0 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20   lwr = idx;.    
2e2c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2e2d0 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a  eto_next_layer;.
2e2e0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2e2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
2e300 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
2e310 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
2e320 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2e330 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
2e340 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2e350 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
2e360 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ize = 0;.       
2e370 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2e380 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2e390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2e3a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e3b0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2e3c0 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2e3d0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2e3e0 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2e3f0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2e400 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
2e410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e420 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2e430 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a    int nCell;  /*
2e440 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65   Size of the pCe
2e450 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73  ll cell in bytes
2e460 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c   */.        pCel
2e470 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2e480 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2e490 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
2e4a0 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
2e4b0 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
2e4c0 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69  65536 bytes. Thi
2e4d0 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
2e4e0 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
2e4f0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
2e500 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
2e510 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
2e520 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
2e530 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61  page is less tha
2e540 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e  n 16384 bytes an
2e550 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  d may be stored 
2e560 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
2e570 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
2e580 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
2e590 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
2e5a0 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
2e5b0 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
2e5c0 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
2e5d0 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
2e5e0 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
2e5f0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
2e600 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
2e610 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
2e620 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
2e630 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
2e640 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
2e650 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
2e660 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
2e670 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65    */.        nCe
2e680 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
2e690 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2e6a0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74  <=pPage->max1byt
2e6b0 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  ePayload ){.    
2e6c0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
2e6d0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
2e6e0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2e6f0 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
2e700 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
2e710 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
2e720 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
2e730 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
2e740 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
2e750 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
2e760 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2e770 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2e780 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50  Cell+nCell+1==pP
2e790 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2e7a0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2e7b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2e7c0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2e7d0 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
2e7e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2e7f0 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
2e800 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
2e810 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
2e820 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
2e830 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
2e840 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
2e850 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2e860 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
2e870 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
2e880 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2e890 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
2e8a0 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
2e8b0 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
2e8c0 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
2e8d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2e8e0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2e8f0 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61  Cell+2==pPage->a
2e900 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2e910 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2e920 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2e930 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c  void*)&pCell[2],
2e940 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2e950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e960 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2e970 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74  d flows over ont
2e980 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  o one or more ov
2e990 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e  erflow pages. In
2e9a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
2e9b0 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c  is case the whol
2e9c0 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20  e cell needs to 
2e9d0 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66  be parsed, a buf
2e9e0 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  fer allocated.  
2e9f0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61          ** and a
2ea00 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75  ccessPayload() u
2ea10 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
2ea20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  the record into 
2ea30 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
2ea40 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56   buffer before V
2ea50 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
2ea60 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
2ea70 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  . .          **.
2ea80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
2ea90 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  the record is co
2eaa0 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f  rrupt, the xReco
2eab0 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e  rdCompare routin
2eac0 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20  e may read.     
2ead0 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77       ** up to tw
2eae0 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74  o varints past t
2eaf0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
2eb00 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31  ffer. An extra 1
2eb10 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  8 .          ** 
2eb20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
2eb30 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74   is allocated at
2eb40 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2eb50 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20  buffer in.      
2eb60 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73      ** case this
2eb70 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20   happens.  */.  
2eb80 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
2eb90 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2eba0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
2ebb0 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
2ebc0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
2ebd0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2ebe0 63 6f 6e 73 74 20 69 6e 74 20 6e 4f 76 65 72 72  const int nOverr
2ebf0 75 6e 20 3d 20 31 38 3b 20 20 2f 2a 20 53 69 7a  un = 18;  /* Siz
2ec00 65 20 6f 66 20 74 68 65 20 6f 76 65 72 72 75 6e  e of the overrun
2ec10 20 70 61 64 64 69 6e 67 20 2a 2f 0a 20 20 20 20   padding */.    
2ec20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
2ec30 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
2ec40 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
2ec50 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
2ec60 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
2ec70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
2ec80 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2ec90 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20  se( nCell<0 );  
2eca0 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20   /* True if key 
2ecb0 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20  size is 2^32 or 
2ecc0 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  more */.        
2ecd0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2ece0 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==0 );  /* Inva
2ecf0 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2ed00 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f  x80 0x80 0x00 */
2ed10 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2ed20 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b  ase( nCell==1 );
2ed30 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2ed40 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2ed50 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20  0 0x01 */.      
2ed60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2ed70 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69  ell==2 );  /* Mi
2ed80 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65  nimum legal inde
2ed90 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20  x key size */.  
2eda0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2edb0 6c 3c 32 20 7c 7c 20 6e 43 65 6c 6c 2f 70 43 75  l<2 || nCell/pCu
2edc0 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  r->pBt->usableSi
2edd0 7a 65 3e 70 43 75 72 2d 3e 70 42 74 2d 3e 6e 50  ze>pCur->pBt->nP
2ede0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
2edf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2ee00 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
2ee10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2ee20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2ee30 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2ee40 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
2ee50 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
2ee60 6f 63 28 20 6e 43 65 6c 6c 2b 6e 4f 76 65 72 72  oc( nCell+nOverr
2ee70 75 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  un );.          
2ee80 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
2ee90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2eea0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2eeb0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2eec0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2eed0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2eee0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
2eef0 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2ef00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2ef10 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
2ef20 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
2ef30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
2ef40 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20  CellKey, 0);.   
2ef50 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28         memset(((
2ef60 75 38 2a 29 70 43 65 6c 6c 4b 65 79 29 2b 6e 43  u8*)pCellKey)+nC
2ef70 65 6c 6c 2c 30 2c 6e 4f 76 65 72 72 75 6e 29 3b  ell,0,nOverrun);
2ef80 20 2f 2a 20 46 69 78 20 75 6e 69 6e 69 74 20 77   /* Fix uninit w
2ef90 61 72 6e 69 6e 67 73 20 2a 2f 0a 20 20 20 20 20  arnings */.     
2efa0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2efb0 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c  ags &= ~BTCF_Val
2efc0 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20  idOvfl;.        
2efd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2efe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2eff0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
2f000 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2f010 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2f020 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f030 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
2f040 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
2f050 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
2f060 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
2f070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2f080 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
2f090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f0a0 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
2f0b0 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d         (pIdxKey-
2f0c0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2f0d0 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30  _CORRUPT || c==0
2f0e0 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
2f0f0 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2f100 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
2f110 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
2f120 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
2f130 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2f140 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
2f150 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2f160 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx+1;.        }e
2f170 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20  lse if( c>0 ){. 
2f180 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2f190 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx-1;.        }e
2f1a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2f1b0 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20  ssert( c==0 );. 
2f1c0 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2f1d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2f1e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f1f0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
2f200 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2f210 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b         if( pIdxK
2f220 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63  ey->errCode ) rc
2f230 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2f240 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2f250 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2f260 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
2f270 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2f280 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
2f290 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2f2a0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2f2b0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2f2c0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2f2d0 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2f2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f2f0 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2f300 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2f310 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2f320 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2f330 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2f340 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2f350 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f360 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2f370 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67  r->ix<pCur->pPag
2f380 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2f390 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2f3a0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
2f3b0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
2f3c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f3d0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2f3e0 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
2f3f0 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
2f400 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
2f410 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2f420 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2f430 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2f440 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2f450 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
2f460 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
2f470 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
2f480 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
2f490 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
2f4a0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77  ur->ix = (u16)lw
2f4b0 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
2f4c0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
2f4d0 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
2f4e0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
2f4f0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
2f500 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2f510 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2f520 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2f530 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2f540 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2f550 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
2f560 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2f570 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2f580 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2f590 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
2f5a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
2f5b0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
2f5c0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
2f5d0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2f5e0 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
2f5f0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2f600 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
2f610 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
2f620 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
2f630 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
2f640 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
2f650 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
2f660 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2f670 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2f680 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
2f690 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
2f6a0 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
2f6b0 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
2f6c0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
2f6d0 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
2f6e0 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
2f6f0 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
2f700 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
2f710 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
2f720 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
2f730 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
2f740 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
2f750 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
2f760 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
2f770 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
2f780 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
2f790 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61  Return an estima
2f7a0 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  te for the numbe
2f7b0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2f7c0 20 74 61 62 6c 65 20 74 68 61 74 20 70 43 75 72   table that pCur
2f7d0 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20   is.** pointing 
2f7e0 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  to.  Return a ne
2f7f0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
2f800 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20   no estimate is 
2f810 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76  currently .** av
2f820 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20  ailable..*/.i64 
2f830 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43  sqlite3BtreeRowC
2f840 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72  ountEst(BtCursor
2f850 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e   *pCur){.  i64 n
2f860 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73  ;.  u8 i;..  ass
2f870 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2f880 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2f890 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2f8a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2f8b0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2f8c0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
2f8d0 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69  Currently this i
2f8e0 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79  nterface is only
2f8f0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f   called by the O
2f900 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a  P_IfSmaller.  **
2f910 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20   opcode, and it 
2f920 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63 75  that case the cu
2f930 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73  rsor will always
2f940 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20   be valid and.  
2f950 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70  ** will always p
2f960 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e  oint to a leaf n
2f970 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ode. */.  if( NE
2f980 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65  VER(pCur->eState
2f990 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  !=CURSOR_VALID) 
2f9a0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69  ) return -1;.  i
2f9b0 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 70  f( NEVER(pCur->p
2f9c0 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 20 29  Page->leaf==0) )
2f9d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e   return -1;..  n
2f9e0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   = pCur->pPage->
2f9f0 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30  nCell;.  for(i=0
2fa00 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b  ; i<pCur->iPage;
2fa10 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20   i++){.    n *= 
2fa20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
2fa30 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65  >nCell;.  }.  re
2fa40 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
2fa50 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
2fa60 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
2fa70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2fa80 61 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74 75 72  abase. .** Retur
2fa90 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  n value:.**.**  
2faa0 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20    SQLITE_OK     
2fab0 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20     success.**   
2fac0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20   SQLITE_DONE    
2fad0 20 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65    cursor is alre
2fae0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ady pointing at 
2faf0 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
2fb00 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65  .**    otherwise
2fb10 20 20 20 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e          some kin
2fb20 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72  d of error occur
2fb30 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  red.**.** The ma
2fb40 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2fb50 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  s sqlite3BtreeNe
2fb60 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  xt().  That rout
2fb70 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2fb80 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2fb90 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2fba0 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  y incrementing t
2fbb0 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2fbc0 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2fbd0 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65  * to the next ce
2fbe0 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2fbf0 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2fc00 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28  ower) btreeNext(
2fc10 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74  ) helper.** rout
2fc20 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2fc30 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2fc40 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2fc50 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f  different page o
2fc60 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20  r.** to restore 
2fc70 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2fc80 2a 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66  * If bit 0x01 of
2fc90 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   the F argument 
2fca0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  in sqlite3BtreeN
2fcb0 65 78 74 28 43 2c 46 29 20 69 73 20 31 2c 20 74  ext(C,F) is 1, t
2fcc0 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  hen the.** curso
2fcd0 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
2fce0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
2fcf0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  d this routine c
2fd00 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a  ould have been.*
2fd10 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  * skipped if the
2fd20 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2fd30 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64  een a unique ind
2fd40 65 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d  ex.  The F argum
2fd50 65 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69 6e 74  ent.** is a hint
2fd60 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
2fd70 74 2e 20 20 53 51 4c 69 74 65 20 62 74 72 65 65  t.  SQLite btree
2fd80 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2fd90 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
2fda0 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43  this hint, but C
2fdb0 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73  OMDB2 does..*/.s
2fdc0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2fdd0 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e  NLINE int btreeN
2fde0 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2fdf0 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
2fe00 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
2fe10 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2fe20 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2fe30 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2fe40 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2fe50 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2fe60 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
2fe70 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2fe80 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2fe90 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72  vfl)==0 );.    r
2fea0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2feb0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2fec0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2fed0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2fef0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2ff00 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2ff10 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72  State ){.      r
2ff20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
2ff30 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  E;.    }.    if(
2ff40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2ff50 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2ff60 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
2ff70 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2ff80 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2ff90 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
2ffa0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2ffb0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
2ffc0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
2ffd0 50 61 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  Page;.  idx = ++
2ffe0 70 43 75 72 2d 3e 69 78 3b 0a 20 20 69 66 28 20  pCur->ix;.  if( 
2fff0 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
30000 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c  {.    /* The onl
30010 79 20 6b 6e 6f 77 6e 20 77 61 79 20 66 6f 72 20  y known way for 
30020 74 68 69 73 20 74 6f 20 68 61 70 70 65 6e 20 69  this to happen i
30030 73 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  s for there to b
30040 65 20 61 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  e a.    ** recur
30050 73 69 76 65 20 53 51 4c 20 66 75 6e 63 74 69 6f  sive SQL functio
30060 6e 20 74 68 61 74 20 64 6f 65 73 20 61 20 44 45  n that does a DE
30070 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 61  LETE operation a
30080 73 20 70 61 72 74 20 6f 66 20 61 0a 20 20 20 20  s part of a.    
30090 2a 2a 20 53 45 4c 45 43 54 20 77 68 69 63 68 20  ** SELECT which 
300a0 64 65 6c 65 74 65 73 20 63 6f 6e 74 65 6e 74 20  deletes content 
300b0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 61  out from under a
300c0 6e 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 0a  n active cursor.
300d0 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
300e0 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
300f0 65 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  e where the tabl
30100 65 20 62 65 69 6e 67 20 44 45 4c 45 54 45 2d 65  e being DELETE-e
30110 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 68 61  d from.    ** ha
30120 73 20 70 61 67 65 73 20 69 6e 20 63 6f 6d 6d 6f  s pages in commo
30130 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
30140 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 2e 20   being queried. 
30150 20 53 65 65 20 54 48 33 0a 20 20 20 20 2a 2a 20   See TH3.    ** 
30160 6d 6f 64 75 6c 65 20 63 6f 76 31 2f 62 74 72 65  module cov1/btre
30170 65 37 38 2e 74 65 73 74 20 74 65 73 74 63 61 73  e78.test testcas
30180 65 20 32 32 30 20 28 32 30 31 38 2d 30 36 2d 30  e 220 (2018-06-0
30190 38 29 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  8) for an.    **
301a0 20 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20 20 20   example. */.   
301b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
301c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
301d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
301e0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
301f0 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
30200 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
30210 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
30220 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
30230 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
30240 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
30250 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
30260 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
30270 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
30280 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
30290 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
302a0 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
302b0 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
302c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
302d0 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
302e0 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
302f0 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
30300 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
30310 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
30320 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
30330 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
30340 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20  nCell );..  if( 
30350 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
30360 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
30370 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
30380 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
30390 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
303a0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
303b0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
303c0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
303d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
303e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
303f0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
30400 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ur);.    }.    d
30410 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
30420 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
30430 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
30440 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
30450 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
30460 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
30470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30480 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
30490 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
304a0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
304b0 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
304c0 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  >ix>=pPage->nCel
304d0 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
304e0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
304f0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
30500 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
30510 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
30520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
30530 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
30540 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
30550 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
30560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30570 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
30580 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
30590 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
305a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
305b0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
305c0 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  r, int flags){. 
305d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
305e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
305f0 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f  TER( flags );  /
30600 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32  * Used in COMDB2
30610 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20   but not native 
30620 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65  SQLite */.  asse
30630 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
30640 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
30650 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
30660 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29  =0 || flags==1 )
30670 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
30680 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
30690 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
306a0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
306b0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
306c0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
306d0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
306e0 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e   ) return btreeN
306f0 65 78 74 28 70 43 75 72 29 3b 0a 20 20 70 50 61  ext(pCur);.  pPa
30700 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
30710 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d  ;.  if( (++pCur-
30720 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >ix)>=pPage->nCe
30730 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ll ){.    pCur->
30740 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  ix--;.    return
30750 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29   btreeNext(pCur)
30760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
30770 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
30780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30790 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
307a0 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
307b0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
307c0 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
307d0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
307e0 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
307f0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
30800 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65   database..** Re
30810 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a  turn values:.**.
30820 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  **     SQLITE_OK
30830 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20       success.** 
30840 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20      SQLITE_DONE 
30850 20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20    the cursor is 
30860 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66  already on the f
30870 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  irst element of 
30880 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  the table.**    
30890 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 73   otherwise     s
308a0 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  ome kind of erro
308b0 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a  r occurred.**.**
308c0 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
308d0 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
308e0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e  BtreePrevious().
308f0 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
30900 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
30910 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
30920 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63  se of merely dec
30930 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
30940 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
30950 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
30960 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c  the previous cel
30970 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
30980 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
30990 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f  wer) btreePrevio
309a0 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72  us().** helper r
309b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
309c0 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
309d0 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
309e0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
309f0 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f  e.** or to resto
30a00 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
30a10 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31  *.** If bit 0x01
30a20 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65   of the F argume
30a30 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  nt to sqlite3Btr
30a40 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29 20  eePrevious(C,F) 
30a50 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  is 1, then.** th
30a60 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70  e cursor corresp
30a70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
30a80 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f  ndex and this ro
30a90 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
30aa0 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64   been.** skipped
30ab0 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65   if the SQL inde
30ac0 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69  x had been a uni
30ad0 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  que index.  The 
30ae0 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a  F argument is a.
30af0 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69  ** hint to the i
30b00 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e  mplement.  The n
30b10 61 74 69 76 65 20 53 51 4c 69 74 65 20 62 74 72  ative SQLite btr
30b20 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
30b30 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73  n does not.** us
30b40 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74  e this hint, but
30b50 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f   COMDB2 does..*/
30b60 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
30b70 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
30b80 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
30b90 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
30ba0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
30bb0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
30bc0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
30bd0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
30be0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
30bf0 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
30c00 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
30c10 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
30c20 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61  NKey))==0 );.  a
30c30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
30c40 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
30c50 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
30c60 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
30c70 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  {.    rc = resto
30c80 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
30c90 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
30ca0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30cb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
30cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30cd0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
30ce0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
30cf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
30d00 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
30d10 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 53      if( CURSOR_S
30d20 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65  KIPNEXT==pCur->e
30d30 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 70  State ){.      p
30d40 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
30d50 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
30d60 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
30d70 4e 65 78 74 3c 30 20 29 20 72 65 74 75 72 6e 20  Next<0 ) return 
30d80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
30d90 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
30da0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
30db0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
30dc0 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
30dd0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
30de0 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
30df0 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ->ix;.    rc = m
30e00 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
30e10 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
30e20 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
30e30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
30e40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
30e50 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
30e60 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
30e70 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
30e80 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20  ur->ix==0 ){.   
30e90 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
30ea0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
30eb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
30ec0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
30ed0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
30ee0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
30ef0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
30f00 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
30f10 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
30f20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
30f30 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
30f40 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
30f50 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64  gs & (BTCF_Valid
30f60 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20  Ovfl))==0 );..  
30f70 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20    pCur->ix--;.  
30f80 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
30f90 70 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  pPage;.    if( p
30fa0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
30fb0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
30fc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30fd0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
30fe0 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65  pCur, 0);.    }e
30ff0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
31000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
31010 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
31020 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
31030 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
31040 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
31050 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
31060 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
31070 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
31080 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
31090 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b  0 || flags==1 );
310a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
310b0 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f  TER( flags );  /
310c0 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32  * Used in COMDB2
310d0 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20   but not native 
310e0 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72  SQLite */.  pCur
310f0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
31100 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
31110 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
31120 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
31130 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
31140 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
31150 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
31160 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
31170 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  >ix==0.   || pCu
31180 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  r->pPage->leaf==
31190 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0.  ){.    retur
311a0 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  n btreePrevious(
311b0 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75  pCur);.  }.  pCu
311c0 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72  r->ix--;.  retur
311d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
311e0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
311f0 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
31200 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31210 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
31220 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
31230 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
31240 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
31250 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
31260 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
31270 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
31280 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
31290 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
312a0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
312b0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
312c0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
312d0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
312e0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
312f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
31300 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
31310 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
31320 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
31330 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
31340 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
31350 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
31360 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
31370 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
31380 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
31390 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
313a0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
313b0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
313c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
313d0 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
313e0 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
313f0 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
31400 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
31410 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
31420 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
31430 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
31440 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
31450 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
31460 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
31470 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
31480 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
31490 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
314a0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
314b0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
314c0 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
314d0 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
314e0 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
314f0 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
31500 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
31510 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
31520 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
31530 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
31540 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
31550 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
31560 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
31570 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
31580 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
31590 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
315a0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
315b0 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
315c0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
315d0 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
315e0 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
315f0 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
31600 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
31610 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
31620 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
31630 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
31640 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
31650 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
31660 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
31670 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
31680 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
31690 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
316a0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
316b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
316c0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
316d0 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
316e0 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
316f0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
31700 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
31710 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
31720 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
31730 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
31740 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
31750 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
31760 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
31770 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
31780 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
31790 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
317a0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
317b0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
317c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
317d0 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
317e0 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
317f0 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
31800 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
31810 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
31820 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
31830 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
31840 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
31850 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
31860 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
31870 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
31880 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
31890 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
318a0 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
318b0 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74  earby>0 && IfNot
318c0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f  OmitAV(pBt->auto
318d0 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50  Vacuum)) );.  pP
318e0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
318f0 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
31900 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
31910 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  t);.  /* EVIDENC
31920 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32  E-OF: R-05119-02
31930 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62  637 The 4-byte b
31940 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
31950 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20  r at offset 36. 
31960 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65   ** stores store
31970 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
31980 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
31990 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a  he freelist. */.
319a0 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
319b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
319c0 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
319d0 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20  n==mxPage-1 );. 
319e0 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29   if( n>=mxPage )
319f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
31a00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
31a10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20  ;.  }.  if( n>0 
31a20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
31a30 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
31a40 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
31a50 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
31a60 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
31a70 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
31a80 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
31a90 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
31aa0 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
31ab0 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
31ac0 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53  y' */.    u32 nS
31ad0 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20  earch = 0;   /* 
31ae0 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  Count of the num
31af0 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74  ber of search at
31b00 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20  tempts */.    . 
31b10 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
31b20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
31b30 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
31b40 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
31b50 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
31b60 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
31b70 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
31b80 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
31b90 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
31ba0 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
31bb0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
31bc0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
31bd0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
31be0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31bf0 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
31c00 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
31c10 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
31c20 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
31c30 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
31c40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31c50 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
31c60 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
31c70 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
31c80 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
31c90 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
31ca0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
31cb0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
31cc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
31cd0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
31ce0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
31cf0 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
31d00 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
31d10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31d20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
31d30 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
31d40 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
31d50 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
31d60 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
31d70 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
31d80 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
31d90 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
31da0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
31db0 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
31dc0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
31dd0 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
31de0 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
31df0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
31e00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31e10 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
31e20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
31e30 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
31e40 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
31e50 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
31e60 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
31e70 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
31e80 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
31e90 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
31ea0 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
31eb0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
31ec0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
31ed0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
31ee0 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
31ef0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
31f00 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
31f10 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
31f20 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
31f30 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
31f40 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
31f50 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
31f60 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
31f70 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
31f80 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
31f90 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
31fa0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
31fb0 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
31fc0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
31fd0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
31fe0 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30  -OF: R-01506-110
31ff0 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  53 The first int
32000 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
32010 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
32020 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
32030 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
32040 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74  he next freelist
32050 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
32060 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20  he list or.     
32070 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68     ** zero if th
32080 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66  is is the last f
32090 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
320a0 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ge. */.        i
320b0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
320c0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
320d0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
320e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
320f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
32100 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20  59841-13798 The 
32110 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
32120 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
32130 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a  set 32.        *
32140 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67  * stores the pag
32150 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
32160 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
32170 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a  e freelist, or z
32180 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a  ero if.        *
32190 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  * the freelist i
321a0 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20  s empty. */.    
321b0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
321c0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
321d0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
321e0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
321f0 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
32200 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
32210 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20  Trunk>mxPage || 
32220 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b  nSearch++ > n ){
32230 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
32240 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
32250 4f 28 70 50 72 65 76 54 72 75 6e 6b 20 3f 20 70  O(pPrevTrunk ? p
32260 50 72 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20  PrevTrunk->pgno 
32270 3a 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 1);.      }els
32280 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
32290 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
322a0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
322b0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
322c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
322d0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
322e0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
322f0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32300 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
32310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32320 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20  Trunk!=0 );.    
32330 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
32340 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20  ->aData!=0 );.  
32350 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
32360 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39  OF: R-13523-0439
32370 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74  4 The second int
32380 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
32390 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
323a0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75      ** is the nu
323b0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
323c0 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f  e pointers to fo
323d0 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b  llow. */.      k
323e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
323f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
32400 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
32410 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
32420 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
32430 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
32440 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
32450 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
32460 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
32470 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
32480 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
32490 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
324a0 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
324b0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
324c0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
324d0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
324e0 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
324f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32500 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
32510 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
32520 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
32530 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
32540 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32560 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
32570 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
32580 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
32590 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
325a0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
325b0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
325c0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
325d0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
325e0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
325f0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
32600 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
32610 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
32620 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
32630 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
32640 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
32650 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
32660 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
32670 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
32680 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
32690 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
326a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
326b0 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
326c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
326d0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
326e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
326f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
32700 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
32710 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20   searchList .   
32720 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61           && (nea
32730 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28  rby==iTrunk || (
32740 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26  iTrunk<nearby &&
32750 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
32760 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  LE)) .      ){. 
32770 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
32780 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
32790 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
327a0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
327b0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
327c0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
327d0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
327e0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
327f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
32800 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
32810 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70  runk;.        *p
32820 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
32830 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
32840 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
32850 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32860 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
32870 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32880 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32890 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
328a0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
328b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
328c0 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
328d0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
328e0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
328f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
32900 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
32910 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
32920 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
32930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32940 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32950 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
32960 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32970 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32980 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
329a0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
329b0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
329c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
329d0 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
329e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
329f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
32a00 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
32a10 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
32a20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
32a30 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
32a40 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
32a50 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
32a60 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
32a70 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
32a80 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
32a90 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
32aa0 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
32ab0 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
32ac0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
32ad0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
32ae0 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
32af0 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
32b00 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
32b10 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
32b20 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
32b30 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
32b40 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
32b50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
32b60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32b70 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72  CORRUPT_PGNO(iTr
32b80 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
32b90 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
32ba0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
32bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32bc0 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
32bd0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
32be0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
32bf0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
32c00 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
32c10 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
32c20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
32c30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32c40 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
32c50 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32c60 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
32c70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32c80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32c90 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
32ca0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
32cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32cc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
32cd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
32ce0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
32cf0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32d00 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32d10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32d20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
32d30 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
32d40 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
32d50 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
32d60 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
32d70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
32d80 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
32d90 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
32da0 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
32db0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
32dc0 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
32dd0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32de0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
32df0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
32e00 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
32e10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
32e20 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
32e30 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
32e40 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
32e50 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
32e60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
32e70 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
32e80 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
32e90 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
32ea0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32eb0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
32ec0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32ed0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
32ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
32ef0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
32f00 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
32f10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
32f20 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
32f30 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
32f40 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
32f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32f60 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
32f70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
32f80 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
32f90 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
32fa0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
32fb0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
32fc0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
32fd0 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
32fe0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
32ff0 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
33000 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
33010 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
33020 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
33030 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
33040 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
33050 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
33060 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
33070 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
33080 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
33090 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
330a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
330b0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
330c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
330d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
330e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
330f0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
33100 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
33110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
33120 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72   if( iPage<=near
33130 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
33140 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
33150 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
33160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
33170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
331a0 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
331b0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
331c0 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
331d0 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
331e0 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  a[8]) - nearby);
331f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
33200 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
33210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
33220 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41  nt d2 = sqlite3A
33230 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
33240 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
33250 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
33260 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
33270 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
33280 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
33290 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
332a0 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
332b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
332c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
332d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
332e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
332f0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
33300 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
33310 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
33320 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
33330 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
33340 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
33350 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
33360 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
33370 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
33380 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
33390 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75  ORRUPT_PGNO(iTru
333a0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  nk);.          g
333b0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
333c0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
333d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
333e0 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
333f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
33400 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20  !searchList .   
33410 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d        || (iPage=
33420 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67  =nearby || (iPag
33430 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  e<nearby && eMod
33440 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
33450 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
33460 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
33470 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ent;.          *
33480 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
33490 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
334a0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
334b0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
334c0 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
334d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
334e0 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
334f0 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
33500 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
33510 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
33520 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
33530 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
33540 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33550 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
33560 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
33570 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
33580 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
33590 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
335a0 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
335b0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
335c0 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
335d0 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
335e0 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
335f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
33600 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
33610 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
33620 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
33630 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
33640 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
33650 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
33660 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20  NTENT : 0;.     
33670 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
33680 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
33690 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
336a0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
336b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
336c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
336d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
336e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
336f0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
33700 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
33710 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33720 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
33730 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
33740 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
33750 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
33760 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
33770 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
33780 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
33790 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
337a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
337b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
337c0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
337d0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
337e0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
337f0 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
33800 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
33810 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
33820 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
33830 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
33840 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
33850 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
33860 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
33870 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
33880 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
33890 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
338a0 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
338b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
338c0 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
338d0 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
338e0 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
338f0 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
33900 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
33910 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
33920 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
33930 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
33940 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
33950 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
33960 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
33970 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
33980 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
33990 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
339a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
339b0 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
339c0 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
339d0 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
339e0 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
339f0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
33a00 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
33a10 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
33a20 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
33a30 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
33a40 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
33a50 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
33a60 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
33a70 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
33a80 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
33a90 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
33aa0 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
33ab0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
33ac0 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
33ad0 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
33ae0 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
33af0 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
33b00 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
33b10 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
33b20 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
33b30 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
33b40 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
33b50 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
33b60 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
33b70 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
33b80 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
33b90 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
33ba0 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
33bb0 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
33bc0 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
33bd0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
33be0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
33bf0 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
33c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
33c10 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
33c20 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
33c30 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
33c40 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20  >bDoTruncate))? 
33c50 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
33c60 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d  ENT:0;..    rc =
33c70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33c80 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
33c90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
33ca0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
33cb0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
33cc0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
33cd0 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
33ce0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
33cf0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
33d00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33d10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33d20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33d30 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
33d40 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
33d50 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
33d60 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
33d70 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
33d80 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
33d90 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
33da0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
33db0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
33dc0 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
33dd0 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
33de0 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
33df0 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
33e00 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
33e10 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
33e20 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
33e30 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
33e40 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
33e50 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
33e60 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
33e70 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
33e80 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
33e90 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
33ea0 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
33eb0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
33ec0 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
33ed0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
33ee0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
33ef0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
33f00 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50   pBt->nPage, &pP
33f10 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  g, bNoContent);.
33f20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33f50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
33f60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
33f70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
33f80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33f90 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
33fa0 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   rc;.      pBt->
33fb0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
33fc0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
33fd0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
33fe0 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50  (pBt) ){ pBt->nP
33ff0 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  age++; }.    }.#
34000 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79  endif.    put4by
34010 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74  te(28 + (u8*)pBt
34020 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
34030 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
34040 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
34050 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65  nPage;..    asse
34060 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
34070 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
34080 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  t) );.    rc = b
34090 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
340a0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
340b0 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e  pPage, bNoConten
340c0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
340d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
340e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
340f0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
34100 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
34110 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34120 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
34130 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
34140 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
34150 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52   0;.    }.    TR
34160 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
34170 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
34180 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
34190 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
341a0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 2a   CORRUPT_DB || *
341b0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
341c0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
341d0 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
341e0 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
341f0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
34200 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
34210 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  runk);.  assert(
34220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
34230 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
34240 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
34250 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d  age)->pDbPage)<=
34260 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  1 );.  assert( r
34270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
34280 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
34290 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
342a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
342b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
342c0 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
342d0 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
342e0 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
342f0 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
34300 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
34310 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
34320 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
34330 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
34340 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
34350 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
34360 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
34370 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34380 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
34390 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
343a0 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
343b0 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
343c0 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
343d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
343e0 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
343f0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
34400 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
34410 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
34420 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
34430 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
34440 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
34450 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
34460 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
34470 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
34480 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
34490 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
344a0 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
344b0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
344c0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
344d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
344e0 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
344f0 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
34500 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
34510 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
34520 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
34530 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
34540 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
34550 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
34560 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
34570 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
34580 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
34590 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
345a0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
345b0 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
345c0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
345d0 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
345e0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
345f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34600 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
34610 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
34620 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
34630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34640 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
34650 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n Code */.  u32 
34660 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
34670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34680 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
34690 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
346a0 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
346b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
346c0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
346d0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
346e0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
346f0 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
34700 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
34710 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
34720 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
34730 28 20 69 50 61 67 65 3c 32 20 7c 7c 20 69 50 61  ( iPage<2 || iPa
34740 67 65 3e 70 42 74 2d 3e 6e 50 61 67 65 20 29 7b  ge>pBt->nPage ){
34750 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
34760 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34770 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d 50  .  }.  if( pMemP
34780 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
34790 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
347a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
347b0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
347c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
347d0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
347e0 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
347f0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
34800 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
34810 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
34820 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
34830 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34840 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
34850 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
34860 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
34870 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
34880 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
34890 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
348a0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
348b0 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
348c0 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
348d0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
348e0 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
348f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
34900 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
34910 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
34920 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
34930 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
34940 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
34950 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
34960 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34970 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
34980 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
34990 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
349a0 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
349b0 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
349c0 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
349d0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
349e0 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
349f0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
34a00 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34a10 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
34a20 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
34a30 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
34a40 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
34a50 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
34a60 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
34a70 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
34a80 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
34a90 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
34aa0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
34ab0 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
34ac0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
34ad0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
34ae0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
34af0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
34b00 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
34b10 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
34b20 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
34b30 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
34b40 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
34b50 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
34b60 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
34b70 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
34b80 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
34b90 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
34ba0 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
34bb0 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
34bc0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
34bd0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
34be0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
34bf0 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
34c00 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
34c10 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
34c20 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
34c30 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
34c40 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
34c50 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
34c60 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
34c70 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
34c80 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
34c90 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
34ca0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
34cb0 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
34cc0 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
34cd0 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
34ce0 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
34cf0 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
34d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34d10 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
34d20 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
34d30 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
34d40 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
34d50 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
34d60 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
34d70 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
34d80 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
34d90 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
34da0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34db0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
34dc0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
34dd0 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
34de0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
34df0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
34e00 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
34e10 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
34e20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
34e30 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
34e40 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
34e50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
34e60 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
34e70 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
34e80 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
34e90 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
34ea0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
34eb0 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
34ec0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
34ed0 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
34ee0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
34ef0 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
34f00 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
34f10 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
34f20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
34f30 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
34f40 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
34f50 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
34f60 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
34f70 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
34f80 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
34f90 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
34fa0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
34fb0 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
34fc0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
34fd0 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
34fe0 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
34ff0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
35000 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
35010 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
35020 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
35030 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
35040 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
35050 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
35060 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
35070 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
35080 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
35090 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
350a0 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
350b0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
350c0 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
350d0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
350e0 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
350f0 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
35100 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
35110 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
35120 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
35130 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
35140 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
35150 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
35160 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
35170 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
35180 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
35190 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
351a0 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
351b0 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
351c0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
351d0 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
351e0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
351f0 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
35200 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
35210 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
35220 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39  IDENCE-OF: R-199
35230 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72  20-11576 However
35240 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  , newer versions
35250 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c   of SQLite still
35260 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20  .      ** avoid 
35270 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73  using the last s
35280 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ix entries in th
35290 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  e freelist trunk
352a0 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20   page array in. 
352b0 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68       ** order th
352c0 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
352d0 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77  s created by new
352e0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
352f0 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20  QLite can be.   
35300 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c     ** read by ol
35310 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
35320 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f  SQLite..      */
35330 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
35340 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
35350 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
35360 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
35370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35380 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
35390 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
353a0 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
353b0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
353c0 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
353d0 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  *4], iPage);.   
353e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26       if( pPage &
353f0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
35400 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
35410 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
35420 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
35430 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
35440 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
35450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
35460 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
35470 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
35480 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
35490 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
354a0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
354b0 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
354c0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
354d0 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
354e0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
354f0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
35500 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
35510 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
35520 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
35530 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
35540 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
35550 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
35560 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
35570 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
35580 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
35590 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
355a0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
355b0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
355c0 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
355d0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
355e0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
355f0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
35600 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
35610 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
35620 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
35630 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
35640 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
35650 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
35660 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
35670 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
35680 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
35690 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
356a0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
356b0 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
356c0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
356d0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
356e0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
356f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
35700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35710 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
35720 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
35730 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
35740 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
35750 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
35760 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
35770 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
35780 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
35790 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
357a0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
357b0 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
357c0 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
357d0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
357e0 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
357f0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
35800 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
35810 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
35820 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
35830 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
35840 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
35850 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
35860 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
35870 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
35880 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
35890 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
358a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
358b0 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
358c0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
358d0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
358e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
358f0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
35900 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
35910 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
35920 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65  .  Store.** size
35930 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
35940 75 74 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 70  ut the cell in p
35950 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
35960 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20  int clearCell(. 
35970 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
35980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
35990 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
359a0 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a  ins the Cell */.
359b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
359c0 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69  *pCell,    /* Fi
359d0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
359e0 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  Cell */.  CellIn
359f0 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
35a00 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72     /* Size infor
35a10 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
35a20 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74   cell */.){.  Bt
35a30 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50  Shared *pBt;.  P
35a40 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
35a50 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
35a60 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
35a70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
35a80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
35a90 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
35aa0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
35ab0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
35ac0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
35ad0 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e  Info);.  if( pIn
35ae0 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66  fo->nLocal==pInf
35af0 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  o->nPayload ){. 
35b00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35b10 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
35b20 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
35b30 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
35b40 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
35b50 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65  .  testcase( pCe
35b60 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  ll + pInfo->nSiz
35b70 65 20 3d 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  e == pPage->aDat
35b80 61 45 6e 64 20 29 3b 0a 20 20 74 65 73 74 63 61  aEnd );.  testca
35b90 73 65 28 20 70 43 65 6c 6c 20 2b 20 28 70 49 6e  se( pCell + (pIn
35ba0 66 6f 2d 3e 6e 53 69 7a 65 2d 31 29 20 3d 3d 20  fo->nSize-1) == 
35bb0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
35bc0 29 3b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 2b  );.  if( pCell +
35bd0 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3e 20   pInfo->nSize > 
35be0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
35bf0 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20 65  ){.    /* Cell e
35c00 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
35c10 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72  of page */.    r
35c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
35c30 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
35c40 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  ;.  }.  ovflPgno
35c50 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
35c60 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  l + pInfo->nSize
35c70 20 2d 20 34 29 3b 0a 20 20 70 42 74 20 3d 20 70   - 4);.  pBt = p
35c80 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73  Page->pBt;.  ass
35c90 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
35ca0 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
35cb0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
35cc0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
35cd0 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e  ;.  nOvfl = (pIn
35ce0 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70  fo->nPayload - p
35cf0 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f  Info->nLocal + o
35d00 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
35d10 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
35d20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30   assert( nOvfl>0
35d30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50   || .    (CORRUP
35d40 54 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e  T_DB && (pInfo->
35d50 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50  nPayload + ovflP
35d60 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67  ageSize)<ovflPag
35d70 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68  eSize).  );.  wh
35d80 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
35d90 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
35da0 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
35db0 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
35dc0 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
35dd0 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
35de0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
35df0 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
35e00 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
35e10 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
35e20 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
35e30 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
35e40 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
35e50 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
35e60 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
35e70 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
35e80 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
35e90 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
35ea0 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
35eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
35ec0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
35ed0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
35ee0 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
35ef0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
35f00 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
35f10 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
35f20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
35f30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
35f40 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
35f50 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
35f60 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
35f70 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
35f80 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
35f90 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
35fa0 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
35fb0 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
35fc0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
35fd0 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
35fe0 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
35ff0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
36000 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
36010 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
36020 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
36030 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
36040 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
36050 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
36060 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
36070 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
36080 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
36090 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
360a0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
360b0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
360c0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
360d0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
360e0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
360f0 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
36100 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
36110 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
36120 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
36130 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
36140 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
36150 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
36160 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
36170 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
36180 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
36190 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
361a0 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
361b0 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
361c0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
361d0 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
361e0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
361f0 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
36200 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
36210 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
36220 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
36230 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
36240 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
36250 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
36260 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
36270 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
36280 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
36290 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
362a0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
362b0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
362c0 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
362d0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
362e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
362f0 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
36300 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
36310 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
36320 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
36330 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
36340 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
36350 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
36360 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
36370 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
36380 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
36390 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
363a0 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
363b0 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
363c0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
363d0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
363e0 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
363f0 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
36400 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
36410 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
36420 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
36430 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
36440 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
36450 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
36460 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
36470 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
36480 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
36490 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
364a0 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
364b0 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
364c0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
364d0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
364e0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
364f0 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
36500 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
36510 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
36520 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
36530 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
36540 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
36550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
36560 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
36570 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
36580 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
36590 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
365a0 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
365b0 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
365c0 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79 6c   const BtreePayl
365d0 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20 20  oad *pX,        
365e0 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68 20  /* Payload with 
365f0 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75  which to constru
36600 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ct the cell */. 
36610 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
36620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36630 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
36640 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
36650 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
36660 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
36670 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
36680 63 2c 20 6d 6e 3b 0a 20 20 69 6e 74 20 73 70 61  c, mn;.  int spa
36690 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
366a0 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 3b 0a 20  e *pToRelease;. 
366b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
366c0 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
366d0 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
366e0 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
366f0 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
36700 76 66 6c 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  vfl;.  int nHead
36710 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
36720 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
36730 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
36740 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
36750 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
36760 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
36770 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
36780 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
36790 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
367a0 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
367b0 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
367c0 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
367d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
367e0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
367f0 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
36800 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 70 42 74  aData[pPage->pBt
36810 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
36820 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
36830 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36840 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
36850 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
36860 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
36870 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70  */.  nHeader = p
36880 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
36890 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ze;.  if( pPage-
368a0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
368b0 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44  Payload = pX->nD
368c0 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b  ata + pX->nZero;
368d0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e  .    pSrc = pX->
368e0 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
368f0 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20  = pX->nData;.   
36900 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
36910 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a  intKeyLeaf ); /*
36920 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
36930 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65  ly called for le
36940 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61  aves */.    nHea
36950 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
36960 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
36970 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  r], nPayload);. 
36980 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
36990 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
369a0 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
369b0 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65  &pX->nKey);.  }e
369c0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
369d0 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66   pX->nKey<=0x7ff
369e0 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b 65  fffff && pX->pKe
369f0 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72 63  y!=0 );.    nSrc
36a00 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69   = nPayload = (i
36a10 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20  nt)pX->nKey;.   
36a20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79   pSrc = pX->pKey
36a30 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  ;.    nHeader +=
36a40 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
36a50 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
36a60 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a  ayload);.  }.  .
36a70 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
36a80 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 70 50   payload */.  pP
36a90 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
36aa0 6e 48 65 61 64 65 72 5d 3b 0a 20 20 69 66 28 20  nHeader];.  if( 
36ab0 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
36ac0 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
36ad0 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
36ae0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
36af0 65 20 65 76 65 72 79 74 68 69 6e 67 20 66 69 74  e everything fit
36b00 73 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 70  s on the btree p
36b10 61 67 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6e  age.    ** and n
36b20 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
36b30 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 20 2a   are required. *
36b40 2f 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65  /.    n = nHeade
36b50 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  r + nPayload;.  
36b60 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33    testcase( n==3
36b70 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
36b80 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66  ( n==4 );.    if
36b90 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20  ( n<4 ) n = 4;. 
36ba0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a     *pnSize = n;.
36bb0 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 72 63      assert( nSrc
36bc0 3c 3d 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  <=nPayload );.  
36bd0 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 72 63    testcase( nSrc
36be0 3c 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20  <nPayload );.   
36bf0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
36c00 2c 20 70 53 72 63 2c 20 6e 53 72 63 29 3b 0a 20  , pSrc, nSrc);. 
36c10 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
36c20 61 64 2b 6e 53 72 63 2c 20 30 2c 20 6e 50 61 79  ad+nSrc, 0, nPay
36c30 6c 6f 61 64 2d 6e 53 72 63 29 3b 0a 20 20 20 20  load-nSrc);.    
36c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36c50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
36c60 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
36c70 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  nt, it means tha
36c80 74 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f  t some of the co
36c90 6e 74 65 6e 74 20 77 69 6c 6c 20 6e 65 65 64 0a  ntent will need.
36ca0 20 20 2a 2a 20 74 6f 20 73 70 69 6c 6c 20 6f 6e    ** to spill on
36cb0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
36cc0 73 2e 0a 20 20 2a 2f 0a 20 20 6d 6e 20 3d 20 70  s..  */.  mn = p
36cd0 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
36ce0 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79    n = mn + (nPay
36cf0 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50  load - mn) % (pP
36d00 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
36d10 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 74 65 73  Size - 4);.  tes
36d20 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
36d30 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
36d40 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67  estcase( n==pPag
36d50 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
36d60 0a 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65  .  if( n > pPage
36d70 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d  ->maxLocal ) n =
36d80 20 6d 6e 3b 0a 20 20 73 70 61 63 65 4c 65 66 74   mn;.  spaceLeft
36d90 20 3d 20 6e 3b 0a 20 20 2a 70 6e 53 69 7a 65 20   = n;.  *pnSize 
36da0 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20  = n + nHeader + 
36db0 34 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  4;.  pPrior = &p
36dc0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b  Cell[nHeader+n];
36dd0 0a 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  .  pToRelease = 
36de0 30 3b 0a 20 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  0;.  pgnoOvfl = 
36df0 30 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  0;.  pBt = pPage
36e00 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 41 74 20  ->pBt;..  /* At 
36e10 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61  this point varia
36e20 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73  bles should be s
36e30 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  et as follows:. 
36e40 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c   **.  **   nPayl
36e50 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f  oad           To
36e60 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65  tal payload size
36e70 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20   in bytes.  **  
36e80 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   pPayload       
36e90 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e      Begin writin
36ea0 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20  g payload here. 
36eb0 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20   **   spaceLeft 
36ec0 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61           Space a
36ed0 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79  vailable at pPay
36ee0 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f  load.  If nPaylo
36ef0 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20  ad>spaceLeft,.  
36f00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
36f10 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61          that mea
36f20 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ns content must 
36f30 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66  spill into overf
36f40 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  low pages..  ** 
36f50 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20    *pnSize       
36f60 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65       Size of the
36f70 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74   local cell (not
36f80 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c   counting overfl
36f90 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20  ow pages).  **  
36fa0 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20   pPrior         
36fb0 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69      Where to wri
36fc0 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74  te the pgno of t
36fd0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
36fe0 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a  w page.  **.  **
36ff0 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62   Use a call to b
37000 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
37010 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  () to verify tha
37020 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f  t the values abo
37030 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d  ve.  ** were com
37040 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  puted correctly.
37050 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
37060 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20  ITE_DEBUG.  {.  
37070 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
37080 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72  .    pPage->xPar
37090 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
370a0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
370b0 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72   assert( nHeader
370c0 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61  ==(int)(info.pPa
370d0 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29  yload - pCell) )
370e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e  ;.    assert( in
370f0 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65  fo.nKey==pX->nKe
37100 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
37110 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
37120 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
37130 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
37140 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
37150 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
37160 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
37170 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
37180 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
37190 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
371a0 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
371b0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
371c0 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
371d0 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
371e0 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
371f0 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
37200 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
37210 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
37220 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
37230 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
37240 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
37250 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
37260 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
37270 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
37280 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
37290 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
372a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
372b0 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
372c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
372d0 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
372e0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
372f0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
37300 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
37310 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
37320 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
37330 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
37340 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
37350 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
37360 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
37370 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
37380 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
37390 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
373a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
373b0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
373c0 20 69 66 28 20 6e 53 72 63 3e 3d 6e 20 29 7b 0a   if( nSrc>=n ){.
373d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
373e0 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
373f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
37400 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e  Src>0 ){.      n
37410 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 6d   = nSrc;.      m
37420 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
37430 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
37440 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
37450 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
37460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
37470 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
37480 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 30 20  if( nPayload<=0 
37490 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 50 61  ) break;.    pPa
374a0 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
374b0 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
374c0 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
374d0 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
374e0 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
374f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  =0 ){.      MemP
37500 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
37510 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37520 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
37530 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
37540 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
37550 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
37560 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
37570 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
37580 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
37590 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
375a0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
375b0 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
375c0 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
375d0 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
375e0 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
375f0 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
37600 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
37610 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
37620 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
37630 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
37640 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
37650 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
37660 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
37670 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
37680 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
37690 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
376a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
376b0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
376c0 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
376d0 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
376e0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
376f0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
37700 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
37710 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
37720 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
37730 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
37740 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
37750 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
37760 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
37770 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
37780 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
37790 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
377a0 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
377b0 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
377c0 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
377d0 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
377e0 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
377f0 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
37800 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
37810 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
37820 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
37830 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
37840 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
37850 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61  ialized values a
37860 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
37870 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
37880 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
37890 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
378a0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
378b0 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
378c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
378d0 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
378e0 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
378f0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
37900 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
37910 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
37920 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
37930 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
37940 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
37950 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37960 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
37970 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
37980 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
37990 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
379a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
379b0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
379c0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
379d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
379e0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
379f0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
37a00 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
37a10 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
37a20 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
37a30 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
37a40 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
37a50 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
37a60 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
37a70 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
37a80 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
37a90 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37aa0 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
37ab0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
37ac0 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
37ad0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
37ae0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
37af0 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
37b00 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
37b10 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
37b20 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
37b30 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
37b40 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
37b50 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
37b60 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
37b70 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
37b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
37b90 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
37ba0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
37bb0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
37bc0 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
37bd0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37be0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
37bf0 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
37c00 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
37c10 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
37c20 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
37c30 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
37c40 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
37c50 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
37c60 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
37c70 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
37c80 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
37c90 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
37ca0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
37cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37cc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  K;.}../*.** Remo
37cd0 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  ve the i-th cell
37ce0 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68   from pPage.  Th
37cf0 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63  is routine effec
37d00 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a  ts pPage only..*
37d10 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * The cell conte
37d20 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20  nt is not freed 
37d30 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  or deallocated. 
37d40 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
37d50 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20  hat.** the cell 
37d60 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
37d70 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63   copied someplac
37d80 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f  e else.  This ro
37d90 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65  utine just.** re
37da0 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65  moves the refere
37db0 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  nce to the cell 
37dc0 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  from pPage..**.*
37dd0 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74  * "sz" must be t
37de0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
37df0 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a  es in the cell..
37e00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
37e10 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
37e20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
37e30 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52   int sz, int *pR
37e40 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20  C){.  u32 pc;   
37e50 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
37e60 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
37e70 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
37e80 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
37e90 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
37ea0 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
37eb0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
37ec0 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
37ed0 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
37ee0 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
37ef0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
37f00 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
37f10 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  de */.  int hdr;
37f20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
37f30 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64  ning of the head
37f40 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65  er.  0 most page
37f50 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a  s.  100 page 1 *
37f60 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
37f70 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
37f80 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
37f90 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
37fa0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
37fb0 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c  T_DB || sz==cell
37fc0 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
37fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
37fe0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
37ff0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
38000 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
38010 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
38020 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
38030 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
38040 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
38050 65 65 3e 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  ee>=0 );.  data 
38060 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
38070 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e    ptr = &pPage->
38080 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b  aCellIdx[2*idx];
38090 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
380a0 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
380b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
380c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
380d0 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
380e0 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
380f0 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
38100 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
38110 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
38120 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
38130 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
38140 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
38150 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
38160 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
38170 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
38180 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
38190 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
381a0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
381b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50  return;.  }.  pP
381c0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
381d0 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
381e0 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ==0 ){.    memse
381f0 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
38200 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b  0, 4);.    data[
38210 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20  hdr+7] = 0;.    
38220 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
38230 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42  dr+5], pPage->pB
38240 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
38250 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
38260 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
38270 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67  sableSize - pPag
38280 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20  e->hdrOffset.   
38290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382a0 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69      - pPage->chi
382b0 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20  ldPtrSize - 8;. 
382c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d   }else{.    memm
382d0 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20  ove(ptr, ptr+2, 
382e0 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  2*(pPage->nCell 
382f0 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74  - idx));.    put
38300 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
38310 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
38320 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
38330 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a  ree += 2;.  }.}.
38340 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
38350 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
38360 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
38370 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
38380 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
38390 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
383a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
383b0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
383c0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
383d0 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
383e0 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
383f0 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
38400 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
38410 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
38420 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
38430 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
38440 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
38450 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
38460 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
38470 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70  .** in pPage->ap
38480 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
38490 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the