/ Hex Artifact Content
Login

Artifact dcc6191c30882af2f621564b05c39ee7fabefc287584835f3dea98cde35f6fac:


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: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
5a40: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
5a50: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
5a60: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
5a70: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
5a80: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
5a90: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
5aa0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5ac0: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
5ad0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5ae0: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5af0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5b10: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5b40: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5b50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5b60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5b70: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
5b80: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5b90: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
5ba0: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5bd0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5be0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5bf0: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5c00: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5c10: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5c20: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5c30: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
5c40: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
5c50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
5c60: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
5c70: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
5c80: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
5c90: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5ca0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
5cb0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
5cc0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
5cd0: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5cf0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5d00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
5d10: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5d20: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
5d30: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
5d40: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5d50: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
5d60: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
5d70: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5d80: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
5d90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5da0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5db0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
5dc0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
5dd0: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
5de0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
5df0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
5e00: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
5e10: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e30: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5e40: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
5e50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
5e60: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
5e70: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
5e80: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
5e90: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
5ea0: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
5eb0: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5ee0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5ef0: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
5f00: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
5f10: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
5f20: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
5f30: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5f40: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5f50: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5f60: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5f70: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5f80: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5f90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
5fa0: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
5fb0: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
5fc0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
5fd0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
5fe0: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
5ff0: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
6000: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
6010: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
6020: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
6030: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
6040: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
6050: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
6060: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
6070: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
6080: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
6090: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
60a0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
60b0: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
60c0: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
60d0: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
60e0: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
60f0: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
6100: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
6110: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
6120: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
6130: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
6140: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
6150: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
6160: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
6170: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
6180: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
6190: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
61a0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
61b0: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
61c0: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
61d0: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
61e0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
61f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
6200: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
6210: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
6220: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
6230: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
6240: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
6250: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
6260: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
6270: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
6280: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
6290: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
62a0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
62b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
62c0: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
62d0: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
62e0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
62f0: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
6300: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
6310: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
6320: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6330: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
6340: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
6350: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
6360: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
6370: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
6380: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
6390: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
63a0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
63b0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
63c0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
63d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
63e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
63f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6400: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
6410: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
6420: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
6430: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
6440: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
6450: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6460: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6470: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6480: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
6490: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
64a0: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
64b0: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
64c0: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
64d0: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
64e0: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
64f0: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
6500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6510: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
6520: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
6530: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
6540: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
6550: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
6560: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
6570: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
6580: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
6590: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
65a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
65b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
65c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
65d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
65e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
65f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
6600: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
6610: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
6620: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
6630: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
6640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
6650: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
6660: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6670: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
6680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6690: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
66a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
66b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
66c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
66d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
66e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
66f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
6700: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
6710: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
6720: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
6730: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
6740: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6750: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6760: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6770: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
6780: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
6790: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
67a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
67b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
67c0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
67d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
67e0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
67f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6800: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
6810: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
6820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6830: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6840: 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  p->iPage>=0 );. 
6850: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
6860: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
6870: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
6880: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
6890: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
68a0: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
68b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
68c0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
68d0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
68e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
68f0: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
6900: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
6910: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
6920: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6930: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
6940: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6950: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
6960: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
6970: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6980: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
6990: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
69a0: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
69b0: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
69c0: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
69d0: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
69e0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
69f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
6a00: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
6a10: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
6a20: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
6a30: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
6a40: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
6a70: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
6a80: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
6a90: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
6aa0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
6ab0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
6ac0: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
6ad0: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
6ae0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
6af0: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
6b00: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
6b10: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
6b20: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
6b30: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
6b40: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
6b50: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
6b60: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
6b70: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
6b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6b90: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
6ba0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
6bb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
6bd0: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
6be0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
6bf0: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
6c00: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
6c10: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
6c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
6c30: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
6c40: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
6c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
6c60: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
6c70: 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  d(pCur->pKeyInfo
6c80: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6c90: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6ca0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6cc0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
6cd0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
6ce0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
6cf0: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
6d00: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
6d20: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6d30: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
6d40: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
6d50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6d60: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
6d70: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6d80: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
6d90: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
6da0: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
6db0: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
6dc0: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
6dd0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
6de0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6df0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
6e00: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
6e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6e20: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
6e30: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
6e40: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
6e50: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
6e60: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
6e70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6e80: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
6e90: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
6ea0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
6eb0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
6ec0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
6ed0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
6ee0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
6ef0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
6f00: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
6f10: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
6f20: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
6f30: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
6f40: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6f50: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
6f60: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
6f70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6f80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6f90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
6fa0: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
6fb0: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
6fc0: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
6fd0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6fe0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6ff0: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
7000: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
7010: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
7020: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
7030: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
7040: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
7050: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
7060: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
7070: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
7080: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
7090: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
70a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
70b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
70c0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
70d0: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
70e0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
70f0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
7100: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7110: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
7120: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
7130: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
7140: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
7150: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
7160: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
7170: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7180: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
7190: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
71a0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
71b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
71c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
71d0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
71e0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
71f0: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
7200: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7210: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
7220: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
7230: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
7240: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
7250: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
7260: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
7270: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
7280: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
7290: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
72a0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
72b0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
72c0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
72d0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
72e0: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
72f0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
7300: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
7310: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
7320: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
7330: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
7340: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
7350: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
7360: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
7370: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
7380: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
7390: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
73a0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
73b0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
73c0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
73d0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
73e0: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
73f0: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
7400: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
7410: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
7420: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
7430: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
7440: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
7450: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7460: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7470: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
7480: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
7490: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
74a0: 54 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c  T(pCur).       |
74b0: 7c 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42  | pCur==sqlite3B
74c0: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
74d0: 73 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72  sor() );.  asser
74e0: 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  t( offsetof(BtCu
74f0: 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30  rsor, eState)==0
7500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69   );.  assert( si
7510: 7a 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74  zeof(pCur->eStat
7520: 65 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  e)==1 );.  retur
7530: 6e 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21  n CURSOR_VALID !
7540: 3d 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a  = *(u8*)pCur;.}.
7550: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7560: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b  pointer to a fak
7570: 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
7580: 74 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61  t that will alwa
7590: 79 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c  ys answer.** fal
75a0: 73 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  se to the sqlite
75b0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
75c0: 6f 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61  oved() routine a
75d0: 62 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a  bove.  The fake.
75e0: 2a 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e  ** cursor return
75f0: 65 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75  ed must not be u
7600: 73 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  sed with any oth
7610: 65 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61  er Btree interfa
7620: 63 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20  ce..*/.BtCursor 
7630: 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b  *sqlite3BtreeFak
7640: 65 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69  eValidCursor(voi
7650: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20  d){.  static u8 
7660: 66 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52  fakeCursor = CUR
7670: 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73  SOR_VALID;.  ass
7680: 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74  ert( offsetof(Bt
7690: 43 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d  Cursor, eState)=
76a0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
76b0: 42 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43  BtCursor*)&fakeC
76c0: 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ursor;.}../*.** 
76d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  This routine res
76e0: 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62  tores a cursor b
76f0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
7700: 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74  nal position aft
7710: 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65  er it.** has bee
7720: 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20  n moved by some 
7730: 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79  outside activity
7740: 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65   (such as a btre
7750: 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a  e rebalance or.*
7760: 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62  * a row having b
7770: 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
7780: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
7790: 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  ursor).  .**.** 
77a0: 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20  On success, the 
77b0: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70  *pDifferentRow p
77c0: 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73  arameter is fals
77d0: 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  e if the cursor 
77e0: 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74  is left.** point
77f0: 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74  ing at exactly t
7800: 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70  he same row.  *p
7810: 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74  DifferntRow is t
7820: 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f  he row the curso
7830: 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e  r.** was pointin
7840: 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65  g to has been de
7850: 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74  leted, forcing t
7860: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
7870: 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65  nt to some.** ne
7880: 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  arby row..**.** 
7890: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
78a0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
78b0: 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  ed for a cursor 
78c0: 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e  that just return
78d0: 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20  ed.** TRUE from 
78e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
78f0: 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f  orHasMoved()..*/
7900: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
7910: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42  eCursorRestore(B
7920: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
7930: 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f  nt *pDifferentRo
7940: 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  w){.  int rc;.. 
7950: 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
7960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
7970: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
7980: 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63  OR_VALID );.  rc
7990: 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
79a0: 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
79b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
79c0: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
79d0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
79e0: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
79f0: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7a00: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
7a10: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7a20: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
7a30: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
7a40: 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20  ipNext==0 );.   
7a50: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
7a60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
7a70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7a80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7a90: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
7aa0: 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  S./*.** Provide 
7ab0: 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72  hints to the cur
7ac0: 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74 69 63  sor.  The partic
7ad0: 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20  ular hint given 
7ae0: 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a  (and the type.**
7af0: 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74   and number of t
7b00: 68 65 20 76 61 72 61 72 67 73 20 70 61 72 61 6d  he varargs param
7b10: 65 74 65 72 73 29 20 69 73 20 64 65 74 65 72 6d  eters) is determ
7b20: 69 6e 65 64 20 62 79 20 74 68 65 20 65 48 69 6e  ined by the eHin
7b30: 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74  tType.** paramet
7b40: 65 72 2e 20 20 53 65 65 20 74 68 65 20 64 65 66  er.  See the def
7b50: 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  initions of the 
7b60: 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63  BTREE_HINT_* mac
7b70: 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ros for details.
7b80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7b90: 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28  BtreeCursorHint(
7ba0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
7bb0: 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e  int eHintType, .
7bc0: 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f  ..){.  /* Used o
7bd0: 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20 74 68  nly by system th
7be0: 61 74 20 73 75 62 73 74 69 74 75 74 65 20 74 68  at substitute th
7bf0: 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20  eir own storage 
7c00: 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64  engine */.}.#end
7c10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  if../*.** Provid
7c20: 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20  e flag hints to 
7c30: 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76  the cursor..*/.v
7c40: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
7c50: 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28  CursorHintFlags(
7c60: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
7c70: 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61  unsigned x){.  a
7c80: 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f  ssert( x==BTREE_
7c90: 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54  SEEK_EQ || x==BT
7ca0: 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20  REE_BULKLOAD || 
7cb0: 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e  x==0 );.  pCur->
7cc0: 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23  hints = x;.}...#
7cd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7ce0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
7cf0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
7d00: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
7d10: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
7d20: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
7d30: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
7d40: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
7d50: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
7d60: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
7d70: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
7d80: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  page number..**.
7d90: 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74  ** Return 0 (not
7da0: 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66   a valid page) f
7db0: 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65  or pgno==1 since
7dc0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
7dd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f  pointer map asso
7de0: 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
7df0: 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69   1.  The integri
7e00: 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a  ty_check logic.*
7e10: 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  * requires that 
7e20: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31  ptrmapPageno(*,1
7e30: 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )!=1..*/.static 
7e40: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
7e50: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
7e60: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
7e70: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
7e80: 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  age;.  Pgno iPtr
7e90: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
7ea0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7eb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
7ec0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
7ed0: 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <2 ) return 0;. 
7ee0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
7ef0: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
7f00: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
7f10: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
7f20: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
7f30: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
7f40: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
7f50: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
7f60: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
7f70: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
7f80: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
7f90: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
7fa0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
7fb0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
7fc0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
7fd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
7fe0: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
7ff0: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
8000: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
8010: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
8020: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
8030: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
8040: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
8050: 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  o'..**.** If *pR
8060: 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e  C is initially n
8070: 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c  on-zero (non-SQL
8080: 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69  ITE_OK) then thi
8090: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
80a0: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20  a no-op.  If an 
80b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
80c0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
80d0: 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74  ror code is writ
80e0: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43  ten.** into *pRC
80f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8100: 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61   ptrmapPut(BtSha
8110: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
8120: 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67  ey, u8 eType, Pg
8130: 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a  no parent, int *
8140: 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  pRC){.  DbPage *
8150: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
8160: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8170: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
8180: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
8190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
81a0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
81b0: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
81c0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
81d0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
81e0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
81f0: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
8200: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
8210: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
8220: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
8230: 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
8240: 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  ons */..  if( *p
8250: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
8260: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8270: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
8280: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
8290: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
82a0: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75  l page number mu
82b0: 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  st never be used
82c0: 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61   as a pointer ma
82d0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65  p page */.  asse
82e0: 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53  rt( 0==PTRMAP_IS
82f0: 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e  PAGE(pBt, PENDIN
8300: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
8310: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
8320: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
8330: 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20  );.  if( key==0 
8340: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
8350: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8360: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
8370: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
8380: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
8390: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
83a0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
83b0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
83c0: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30  map, &pDbPage, 0
83d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
83e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
83f0: 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
8400: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65  urn;.  }.  offse
8410: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8420: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8430: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8440: 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  <0 ){.    *pRC =
8450: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8460: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
8470: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
8480: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
8490: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
84a0: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
84b0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
84c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
84d0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
84e0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
84f0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
8500: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8510: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
8520: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
8530: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
8540: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
8550: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
8560: 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43  rent));.    *pRC
8570: 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  = rc = sqlite3Pa
8580: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
8590: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
85a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
85b0: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
85c0: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
85d0: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
85e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
85f0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
8600: 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20  ..ptrmap_exit:. 
8610: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
8620: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a  ef(pDbPage);.}..
8630: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
8640: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
8650: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
8660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
8670: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
8680: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
8690: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
86a0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
86b0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
86c0: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
86d0: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
86e0: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
86f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
8700: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
8710: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
8720: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
8730: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
8740: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
8750: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
8760: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
8770: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
8780: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
8790: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
87a0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
87b0: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
87c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
87d0: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
87e0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
87f0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8800: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
8810: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
8820: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
8830: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
8840: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
8850: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
8860: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8870: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
8880: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
8890: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
88a0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
88b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
88c0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
88d0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
88e0: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  e, 0);.  if( rc!
88f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8900: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
8910: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
8920: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
8930: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
8940: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
8950: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
8960: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
8970: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
8980: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
8990: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
89a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
89b0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
89c0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
89d0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
89e0: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
89f0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
8a00: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
8a10: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
8a20: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
8a30: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
8a40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
8a50: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
8a60: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
8a70: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
8a80: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
8a90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8aa0: 52 52 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d  RRUPT_PGNO(iPtrm
8ab0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ap);.  return SQ
8ac0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
8ad0: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
8ae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8af0: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
8b00: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
8b10: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
8b20: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
8b30: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
8b40: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8b50: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
8b60: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
8b70: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
8b80: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
8b90: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
8ba0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
8bb0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
8bc0: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
8bd0: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
8be0: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
8bf0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
8c00: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
8c10: 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61  **.** findCellPa
8c20: 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68 65  stPtr() does the
8c30: 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74 20   same except it 
8c40: 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20 69  skips past the i
8c50: 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65  nitial.** 4-byte
8c60: 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66   child pointer f
8c70: 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72  ound on interior
8c80: 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72 65   pages, if there
8c90: 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54   is one..**.** T
8ca0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
8cb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
8cc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
8cd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
8ce0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
8cf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
8d00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
8d10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
8d20: 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
8d30: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
8d40: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
8d50: 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  e findCellPastPt
8d60: 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  r(P,I) \.  ((P)-
8d70: 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50  >aDataOfst + ((P
8d80: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
8d90: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28  t2byteAligned(&(
8da0: 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28  P)->aCellIdx[2*(
8db0: 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54  I)]))).../*.** T
8dc0: 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61  his is common ta
8dd0: 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  il processing fo
8de0: 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  r btreeParseCell
8df0: 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72  Ptr() and.** btr
8e00: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
8e10: 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63 61  dex() for the ca
8e20: 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c  se when the cell
8e30: 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e   does not fit en
8e40: 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73  tirely.** on a s
8e50: 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67  ingle B-tree pag
8e60: 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61  e.  Make necessa
8e70: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74  ry adjustments t
8e80: 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a  o the CellInfo.*
8e90: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
8ea0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
8eb0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65  INLINE void btre
8ec0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
8ed0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
8ee0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8ef0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
8f00: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
8f10: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
8f20: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
8f30: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8f40: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
8f50: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8f60: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8f70: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
8f80: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
8f90: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
8fa0: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
8fb0: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
8fc0: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
8fd0: 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63  have.  ** to dec
8fe0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
8ff0: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
9000: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
9010: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76  ill onto.  ** ov
9020: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
9030: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
9040: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
9050: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
9060: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
9070: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
9080: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
9090: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
90a0: 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62  torage.  ** in b
90b0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
90c0: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
90d0: 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  **.  ** Warning:
90e0: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
90f0: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
9100: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
9110: 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77  ed in any.  ** w
9120: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
9130: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
9140: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
9150: 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63   */.  int minLoc
9160: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
9170: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
9180: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
9190: 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c  /.  int maxLocal
91a0: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
91b0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
91c0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
91d0: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
91e0: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
91f0: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
9200: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
9210: 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20   */..  minLocal 
9220: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
9230: 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  l;.  maxLocal = 
9240: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
9250: 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e  .  surplus = min
9260: 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e  Local + (pInfo->
9270: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
9280: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
9290: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b  ->usableSize-4);
92a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72  .  testcase( sur
92b0: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29  plus==maxLocal )
92c0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
92d0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
92e0: 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c  1 );.  if( surpl
92f0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
9300: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
9310: 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c  cal = (u16)surpl
9320: 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  us;.  }else{.   
9330: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9340: 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a   (u16)minLocal;.
9350: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69    }.  pInfo->nSi
9360: 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66  ze = (u16)(&pInf
9370: 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66  o->pPayload[pInf
9380: 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65  o->nLocal] - pCe
9390: 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a  ll) + 4;.}../*.*
93a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
93b0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70  routines are imp
93c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
93d0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72  the MemPage.xPar
93e0: 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68  seCell().** meth
93f0: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20  od..**.** Parse 
9400: 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  a cell content b
9410: 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e  lock and fill in
9420: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74   the CellInfo st
9430: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62  ructure..**.** b
9440: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9450: 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74  ()        =>   t
9460: 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20  able btree leaf 
9470: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
9480: 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64  rseCellNoPayload
9490: 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62  ()  =>   table b
94a0: 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  tree internal no
94b0: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
94c0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
94d0: 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72    =>   index btr
94e0: 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54  ee nodes.**.** T
94f0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77  here is also a w
9500: 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  rapper function 
9510: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
9520: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
9530: 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74  ** all MemPage t
9540: 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72 65  ypes and that re
9550: 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c  ferences the cel
9560: 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68 65  l by index rathe
9570: 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69  r than.** by poi
9580: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
9590: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
95a0: 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  ellPtrNoPayload(
95b0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
95c0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
95d0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
95e0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
95f0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9600: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9610: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9620: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9630: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9640: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9650: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9660: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9670: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9680: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9690: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
96a0: 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61  ->leaf==0 );.  a
96b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
96c0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
96d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
96e0: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
96f0: 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b  ARAMETER(pPage);
9700: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d  .#endif.  pInfo-
9710: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
9720: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
9730: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
9740: 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  nKey);.  pInfo->
9750: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
9760: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9770: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  0;.  pInfo->pPay
9780: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  load = 0;.  retu
9790: 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rn;.}.static voi
97a0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
97b0: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
97c0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
97d0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
97e0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
97f0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9800: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9810: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9820: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9830: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9840: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9850: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9860: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
9870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9880: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9890: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
98a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
98b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
98c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
98d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  l payload */.  u
98e0: 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20  64 iKey;        
98f0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
9900: 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f  ted Key value */
9910: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9920: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9930: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9940: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9950: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
9960: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
9970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9980: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
9990: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
99a0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
99b0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
99c0: 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65  pCell;..  /* The
99d0: 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63   next block of c
99e0: 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ode is equivalen
99f0: 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
9a00: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
9a10: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
9a20: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a  nPayload);.  **.
9a30: 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73    ** The code is
9a40: 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69   inlined to avoi
9a50: 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  d a function cal
9a60: 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f  l..  */.  nPaylo
9a70: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9a80: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9a90: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9aa0: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9ab0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9ac0: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9ad0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9ae0: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9af0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9b00: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70  .    }while( (*p
9b10: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9b20: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9b30: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f  .  pIter++;..  /
9b40: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
9b50: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
9b60: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
9b70: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
9b80: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
9b90: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
9ba0: 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a  >nKey);.  **.  *
9bb0: 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e  * The code is in
9bc0: 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61  lined to avoid a
9bd0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a   function call..
9be0: 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70    */.  iKey = *p
9bf0: 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79  Iter;.  if( iKey
9c00: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9c10: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9c20: 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20  7];.    iKey &= 
9c30: 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28  0x7f;.    while(
9c40: 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d  1){.      iKey =
9c50: 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b   (iKey<<7) | (*+
9c60: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
9c70: 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74 65        if( (*pIte
9c80: 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b  r)<0x80 ) break;
9c90: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
9ca0: 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  >=pEnd ){.      
9cb0: 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c    iKey = (iKey<<
9cc0: 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20  8) | *++pIter;. 
9cd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9ce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9cf0: 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49    pIter++;..  pI
9d00: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36  nfo->nKey = *(i6
9d10: 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66  4*)&iKey;.  pInf
9d20: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
9d30: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
9d40: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65  >pPayload = pIte
9d50: 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
9d60: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9d70: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9d80: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
9d90: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9da0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  l+1 );.  if( nPa
9db0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
9dc0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
9dd0: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
9de0: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
9df0: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
9e00: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
9e10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
9e20: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
9e30: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
9e40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
9e50: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79  fo->nSize = nPay
9e60: 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74  load + (u16)(pIt
9e70: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
9e80: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   if( pInfo->nSiz
9e90: 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  e<4 ) pInfo->nSi
9ea0: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
9eb0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
9ec0: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c  )nPayload;.  }el
9ed0: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
9ee0: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
9ef0: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
9f00: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
9f10: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
9f20: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9f30: 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65  llPtrIndex(.  Me
9f40: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9f50: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9f60: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9f70: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
9f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9f90: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
9fa0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
9fb0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9fd0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9fe0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
9ff0: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
a000: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
a010: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
a020: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
a030: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
a040: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
a050: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
a060: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
a070: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a080: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
a090: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
a0a0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
a0b0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
a0c0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
a0d0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
a0e0: 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  f==0 );.  pIter 
a0f0: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
a100: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
a110: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
a120: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
a130: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
a140: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
a150: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
a160: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
a170: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
a180: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
a190: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
a1a0: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
a1b0: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
a1c0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a1d0: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
a1e0: 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  +;.  pInfo->nKey
a1f0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a200: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
a210: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
a220: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70  fo->pPayload = p
a230: 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Iter;.  testcase
a240: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a250: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
a260: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
a270: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
a280: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a290: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
a2a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a2b0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
a2c0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
a2d0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
a2e0: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
a2f0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
a300: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
a310: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
a320: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
a330: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
a340: 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28  Payload + (u16)(
a350: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a360: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
a370: 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  Size<4 ) pInfo->
a380: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
a390: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
a3a0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
a3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65  }else{.    btree
a3c0: 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53  ParseCellAdjustS
a3d0: 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70  izeForOverflow(p
a3e0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e  Page, pCell, pIn
a3f0: 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  fo);.  }.}.stati
a400: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
a410: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
a420: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
a430: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
a440: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
a450: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
a460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a470: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
a480: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
a490: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a4a0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a4b0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a4c0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61  ture */.){.  pPa
a4d0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a4e0: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
a4f0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49  Page, iCell), pI
a500: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  nfo);.}../*.** T
a510: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
a520: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
a530: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
a540: 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69   MemPage.xCellSi
a550: 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ze.** method..**
a560: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
a570: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
a580: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
a590: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
a5a0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
a5b0: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
a5c0: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
a5d0: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
a5e0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
a5f0: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
a600: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
a610: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
a620: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
a630: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
a640: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
a650: 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a  r..**.** cellSiz
a660: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20  ePtrNoPayload() 
a670: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e     =>   table in
a680: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
a690: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20  cellSizePtr()   
a6a0: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61            =>   a
a6b0: 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26  ll index nodes &
a6c0: 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65   table leaf node
a6d0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  s.*/.static u16 
a6e0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
a6f0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
a700: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
a710: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50  ter = pCell + pP
a720: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a730: 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  e; /* For loopin
a740: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
a750: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
a760: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20      /* End mark 
a790: 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a  for a varint */.
a7a0: 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20    u32 nSize;    
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a7d0: 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  ze value to retu
a7e0: 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  rn */..#ifdef SQ
a7f0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
a800: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
a810: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a820: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a830: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
a840: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
a850: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
a860: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
a870: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
a880: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
a890: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
a8a0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
a8b0: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
a8c0: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
a8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
a8e0: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
a8f0: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
a900: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
a910: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
a920: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
a930: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
a940: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
a950: 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65  .#endif..  nSize
a960: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
a970: 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a   nSize>=0x80 ){.
a980: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
a990: 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20  r[8];.    nSize 
a9a0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
a9b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  .      nSize = (
a9c0: 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b  nSize<<7) | (*++
a9d0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
a9e0: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
a9f0: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
aa00: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
aa10: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20   pIter++;.  if( 
aa20: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
aa30: 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f  .    /* pIter no
aa40: 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  w points at the 
aa50: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b  64-bit integer k
aa60: 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69  ey value, a vari
aa70: 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20  able length .   
aa80: 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65   ** integer. The
aa90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
aaa0: 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20   moves pIter to 
aab0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
aac0: 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70  st byte.    ** p
aad0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
aae0: 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f  he key value. */
aaf0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
ab00: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
ab10: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
ab20: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
ab30: 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
ab40: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ab50: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
ab60: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
ab70: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
ab80: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
ab90: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
aba0: 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b  l ){.    nSize +
abb0: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
abc0: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
abd0: 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20  nSize<4 ) nSize 
abe0: 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 4;.  }else{.  
abf0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
ac00: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
ac10: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
ac20: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
ac30: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
ac40: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ac50: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
ac60: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
ac70: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
ac80: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
ac90: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
aca0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
acb0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
acc0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
acd0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
ace0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
acf0: 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75   nSize += 4 + (u
ad00: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
ad10: 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  l);.  }.  assert
ad20: 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e  ( nSize==debugin
ad30: 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52  fo.nSize || CORR
ad40: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
ad50: 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d  rn (u16)nSize;.}
ad60: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
ad70: 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
ad80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ad90: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
ada0: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
adb0: 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f   + 4; /* For loo
adc0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
add0: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
ade0: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
adf0: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
ae00: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
ae10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ae20: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
ae30: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
ae40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
ae50: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
ae60: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
ae70: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
ae80: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
ae90: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
aea0: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
aeb0: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
aec0: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
aed0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
aee0: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
aef0: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
af00: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
af10: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
af20: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
af30: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
af40: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70  o debuginfo;.  p
af50: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
af60: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
af70: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73  debuginfo);.#els
af80: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
af90: 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e  ETER(pPage);.#en
afa0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
afb0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
afc0: 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20  ze==4 );.  pEnd 
afd0: 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77  = pIter + 9;.  w
afe0: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
aff0: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
b000: 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  End );.  assert(
b010: 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65   debuginfo.nSize
b020: 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  ==(u16)(pIter - 
b030: 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50  pCell) || CORRUP
b040: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
b050: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
b060: 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65  Cell);.}...#ifde
b070: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
b080: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
b090: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
b0a0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
b0b0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
b0c0: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
b0d0: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
b0e0: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
b0f0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
b100: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  l){.  return pPa
b110: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
b120: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
b130: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
b140: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
b150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
b160: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
b170: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
b180: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
b190: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
b1a0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
b1b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
b1c0: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
b1d0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
b1e0: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
b1f0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
b200: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
b210: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
b220: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
b230: 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43  *pCell, int *pRC
b240: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
b250: 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29  fo;.  if( *pRC )
b260: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
b270: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
b280: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b290: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b2a0: 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
b2b0: 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
b2c0: 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
b2d0: 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
b2e0: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
b2f0: 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20  .nSize-4]);.    
b300: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
b310: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
b320: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
b330: 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b  age->pgno, pRC);
b340: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
b350: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
b360: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
b370: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
b380: 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20  organizes cells 
b390: 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61  within the.** pa
b3a0: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b3b0: 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f   are no free-blo
b3c0: 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  cks on the free-
b3d0: 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  block list..**.*
b3e0: 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78  * Parameter nMax
b3f0: 46 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69  Frag is the maxi
b400: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  mum amount of fr
b410: 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74  agmented space t
b420: 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72  hat may be.** pr
b430: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67  esent in the pag
b440: 65 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75  e after this rou
b450: 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tine returns..**
b460: 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  .** EVIDENCE-OF:
b470: 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53   R-44582-60138 S
b480: 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74  QLite may from t
b490: 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72  ime to time reor
b4a0: 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72  ganize a.** b-tr
b4b0: 65 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  ee page so that 
b4c0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65  there are no fre
b4d0: 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d  eblocks or fragm
b4e0: 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a  ent bytes, all.*
b4f0: 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  * unused bytes a
b500: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
b510: 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20  the unallocated 
b520: 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e  space region, an
b530: 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61  d all.** cells a
b540: 72 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c  re packed tightl
b550: 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  y at the end of 
b560: 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
b570: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
b580: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
b590: 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46  pPage, int nMaxF
b5a0: 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  rag){.  int i;  
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
b5d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
b600: 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a   the i-th cell *
b610: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b630: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
b640: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
b650: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
b660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b670: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
b680: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
b690: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
b6a0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
b6b0: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
b6c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
b6d0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
b6e0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b6f0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
b700: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
b710: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
b720: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b730: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
b740: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
b750: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
b760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b770: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
b780: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
b790: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
b7a0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
b7b0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
b7c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
b7d0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
b7e0: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
b7f0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69  ontent */.  unsi
b800: 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20  gned char *src; 
b810: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
b820: 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20   of content */. 
b830: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
b840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b850: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
b860: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
b870: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
b880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
b890: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
b8a0: 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65  index */..  asse
b8b0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b8c0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
b8d0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b8e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b8f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b900: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
b910: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
b920: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
b930: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
b940: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
b950: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
b960: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b970: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
b980: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
b990: 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61   = 0;.  src = da
b9a0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
b9b0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
b9c0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
b9d0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
b9e0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
b9f0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
ba00: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
ba10: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
ba20: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
ba30: 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  ;.  iCellFirst =
ba40: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
ba50: 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53  nCell;.  usableS
ba60: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
ba70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20  ->usableSize;.. 
ba80: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 68   /* This block h
ba90: 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69 74  andles pages wit
baa0: 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 66  h two or fewer f
bab0: 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e  ree blocks and n
bac0: 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20  MaxFrag.  ** or 
bad0: 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65 64  fewer fragmented
bae0: 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73 20   bytes. In this 
baf0: 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74 65  case it is faste
bb00: 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20  r to move the.  
bb10: 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20  ** two (or one) 
bb20: 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20  blocks of cells 
bb30: 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20  using memmove() 
bb40: 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71 75  and add the requ
bb50: 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74  ired.  ** offset
bb60: 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74 65  s to each pointe
bb70: 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f  r in the cell-po
bb80: 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61 6e  inter array than
bb90: 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20   it is to .  ** 
bba0: 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  reconstruct the 
bbb0: 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a 2f  entire page.  */
bbc0: 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74 61  .  if( (int)data
bbd0: 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61  [hdr+7]<=nMaxFra
bbe0: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 72  g ){.    int iFr
bbf0: 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ee = get2byte(&d
bc00: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
bc10: 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20   if( iFree ){.  
bc20: 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d      int iFree2 =
bc30: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bc40: 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20  iFree]);..      
bc50: 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28  /* pageFindSlot(
bc60: 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 76 65  ) has already ve
bc70: 72 69 66 69 65 64 20 74 68 61 74 20 66 72 65 65  rified that free
bc80: 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72 74   blocks are sort
bc90: 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f  ed.      ** in o
bca0: 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20 77  rder of offset w
bcb0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c 20  ithin the page, 
bcc0: 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63  and that no bloc
bcd0: 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20 20  k extends.      
bce0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
bcf0: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50 72 6f  of the page. Pro
bd00: 76 69 64 65 64 20 74 68 65 20 74 77 6f 20 66 72  vided the two fr
bd10: 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20  ee slots do not 
bd20: 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61  .      ** overla
bd30: 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  p, this guarante
bd40: 65 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6d  es that the memm
bd50: 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f  ove() calls belo
bd60: 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20  w will not.     
bd70: 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74 68   ** overwrite th
bd80: 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79 74  e usableSize byt
bd90: 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20 69  e buffer, even i
bda0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  f the database p
bdb0: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
bdc0: 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20  corrupt.  */.   
bdd0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
bde0: 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e 69  2==0 || iFree2>i
bdf0: 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Free );.      as
be00: 73 65 72 74 28 20 69 46 72 65 65 2b 67 65 74 32  sert( iFree+get2
be10: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
be20: 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  +2]) <= usableSi
be30: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
be40: 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c  rt( iFree2==0 ||
be50: 20 69 46 72 65 65 32 2b 67 65 74 32 62 79 74 65   iFree2+get2byte
be60: 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d  (&data[iFree2+2]
be70: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
be80: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
be90: 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61  =iFree2 || (data
bea0: 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64  [iFree2]==0 && d
beb0: 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30  ata[iFree2+1]==0
bec0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ) ){.        u8 
bed0: 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65  *pEnd = &data[ce
bee0: 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
bef0: 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  *2];.        u8 
bf00: 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20  *pAddr;.        
bf10: 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20  int sz2 = 0;.   
bf20: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65       int sz = ge
bf30: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
bf40: 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  ee+2]);.        
bf50: 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79  int top = get2by
bf60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
bf70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
bf80: 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20  p>=iFree ){.    
bf90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
bfa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
bfb0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
bfc0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
bfd0: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
bfe0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
bff0: 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29 3b 20 2f  +sz<=iFree2 ); /
c000: 2a 20 56 65 72 69 66 69 65 64 20 62 79 20 70 61  * Verified by pa
c010: 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 2a 2f 0a  geFindSlot() */.
c020: 20 20 20 20 20 20 20 20 20 20 73 7a 32 20 3d 20            sz2 = 
c030: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
c040: 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20  Free2+2]);.     
c050: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
c060: 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32  ee+sz+sz2+iFree2
c070: 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75  -(iFree+sz) <= u
c080: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c090: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
c0a0: 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a  data[iFree+sz+sz
c0b0: 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b  2], &data[iFree+
c0c0: 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72  sz], iFree2-(iFr
c0d0: 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20  ee+sz));.       
c0e0: 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20     sz += sz2;.  
c0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c100: 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20  cbrk = top+sz;. 
c110: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
c120: 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20  brk+(iFree-top) 
c130: 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  <= usableSize );
c140: 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  .        memmove
c150: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64  (&data[cbrk], &d
c160: 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d  ata[top], iFree-
c170: 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  top);.        fo
c180: 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65  r(pAddr=&data[ce
c190: 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72  llOffset]; pAddr
c1a0: 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29  <pEnd; pAddr+=2)
c1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  {.          pc =
c1c0: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
c1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c1e0: 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32  pc<iFree ){ put2
c1f0: 62 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73  byte(pAddr, pc+s
c200: 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  z); }.          
c210: 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46 72 65  else if( pc<iFre
c220: 65 32 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  e2 ){ put2byte(p
c230: 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d  Addr, pc+sz2); }
c240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c250: 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65     goto defragme
c260: 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  nt_out;.      }.
c270: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72      }.  }..  cbr
c280: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
c290: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
c2a0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
c2b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
c2c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
c2d0: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
c2e0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
c2f0: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
c300: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
c310: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
c320: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
c330: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
c340: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
c350: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
c360: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
c370: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
c380: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
c390: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
c3a0: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
c3b0: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
c3c0: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
c3d0: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
c3e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
c3f0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
c400: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
c410: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c420: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
c430: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
c440: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
c450: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
c460: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
c470: 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e    size = pPage->
c480: 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
c490: 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20   &src[pc]);.    
c4a0: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20  cbrk -= size;.  
c4b0: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
c4c0: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
c4d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c4e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c4f0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
c500: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
c510: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
c520: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
c530: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
c540: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
c550: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
c560: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c570: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
c580: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c590: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
c5a0: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
c5b0: 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b    if( temp==0 ){
c5c0: 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  .      int x;.  
c5d0: 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63      if( cbrk==pc
c5e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c5f0: 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65     temp = sqlite
c600: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
c610: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
c620: 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  er);.      x = g
c630: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
c640: 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d  r+5]);.      mem
c650: 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64  cpy(&temp[x], &d
c660: 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69  ata[x], (cbrk+si
c670: 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20  ze) - x);.      
c680: 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20  src = temp;.    
c690: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  }.    memcpy(&da
c6a0: 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70  ta[cbrk], &src[p
c6b0: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  c], size);.  }. 
c6c0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c6d0: 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f  ;.. defragment_o
c6e0: 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61 5b 68  ut:.  if( data[h
c6f0: 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c  dr+7]+cbrk-iCell
c700: 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46  First!=pPage->nF
c710: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
c720: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c730: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
c740: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
c750: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
c760: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c770: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
c780: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
c790: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
c7a0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
c7b0: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
c7c0: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
c7d0: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
c7e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c7f0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c800: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
c810: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c820: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
c830: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
c840: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
c850: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
c860: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
c870: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
c880: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
c890: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
c8a0: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
c8b0: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
c8c0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c8d0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
c8e0: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
c8f0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
c900: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
c910: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
c920: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
c930: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
c940: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
c950: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
c960: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
c970: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
c980: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
c990: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
c9a0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
c9b0: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
c9c0: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
c9d0: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
c9e0: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
c9f0: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
ca00: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
ca10: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
ca20: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
ca30: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
ca40: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
ca50: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
ca60: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
ca70: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
ca80: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
ca90: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
caa0: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
cab0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
cac0: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
cad0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
cae0: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
caf0: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
cb00: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
cb10: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
cb20: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
cb30: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
cb40: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
cb50: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
cb60: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
cb70: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
cb80: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
cb90: 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20  .  assert( pc>0 
cba0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3c 3d  );.  while( pc<=
cbb0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a  usableSize-4 ){.
cbc0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cbd0: 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32  OF: R-22710-5332
cbe0: 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20  8 The third and 
cbf0: 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20  fourth bytes of 
cc00: 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65  each.    ** free
cc10: 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67  block form a big
cc20: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
cc30: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
cc40: 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f  e of the freeblo
cc50: 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74  ck.    ** in byt
cc60: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  es, including th
cc70: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e  e 4-byte header.
cc80: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67   */.    size = g
cc90: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
cca0: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  c+2]);.    if( (
ccb0: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
ccc0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
ccd0: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
cce0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ccf0: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  x==3 );.      if
cd00: 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62  ( size+pc > usab
cd10: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
cd20: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
cd30: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
cd40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
cd50: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
cd60: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
cd70: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cd80: 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32  OF: R-11498-5802
cd90: 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  2 In a well-form
cda0: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
cdb0: 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20  the total.      
cdc0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62    ** number of b
cdd0: 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74  ytes in fragment
cde0: 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64  s may not exceed
cdf0: 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   60. */.        
ce00: 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  if( aData[hdr+7]
ce10: 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >57 ) return 0;.
ce20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
ce30: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
ce40: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
ce50: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
ce60: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
ce70: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
ce80: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
ce90: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
cea0: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
ceb0: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
cec0: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
ced0: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
cee0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cef0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
cf00: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
cf10: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
cf20: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
cf30: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
cf40: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
cf50: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
cf60: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
cf70: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62  */.        put2b
cf80: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
cf90: 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , x);.      }.  
cfa0: 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74      return &aDat
cfb0: 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d  a[pc + x];.    }
cfc0: 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b  .    iAddr = pc;
cfd0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
cfe0: 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a  te(&aData[pc]);.
cff0: 20 20 20 20 69 66 28 20 70 63 3c 69 41 64 64 72      if( pc<iAddr
d000: 2b 73 69 7a 65 20 29 20 62 72 65 61 6b 3b 0a 20  +size ) break;. 
d010: 20 7d 0a 20 20 69 66 28 20 70 63 20 29 7b 0a 20   }.  if( pc ){. 
d020: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
d030: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
d040: 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
d050: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
d060: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
d070: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
d080: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
d090: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
d0a0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
d0b0: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
d0c0: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
d0d0: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
d0e0: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
d0f0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
d100: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
d110: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
d120: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
d130: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
d140: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
d150: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
d160: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
d170: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
d180: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
d190: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
d1a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
d1b0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
d1c0: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
d1d0: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
d1e0: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
d1f0: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
d200: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
d210: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
d220: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
d230: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
d240: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
d250: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
d260: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
d270: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
d280: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
d290: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
d2a0: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
d2b0: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
d2c0: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
d2d0: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
d2e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d2f0: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
d300: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
d310: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
d320: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
d330: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
d340: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
d350: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
d360: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
d370: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
d380: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
d390: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
d3a0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d3b0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
d3c0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
d3f0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
d400: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
d410: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d430: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
d440: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
d450: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
d460: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
d470: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
d480: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
d490: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
d4a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d4b0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
d4c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
d4d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d4e0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
d4f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d500: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d510: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
d520: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
d530: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
d540: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
d550: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d560: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
d570: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d580: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
d590: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
d5a0: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
d5b0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d5c0: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
d5d0: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
d5e0: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
d5f0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
d600: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
d610: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
d620: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
d630: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
d640: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
d650: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
d660: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
d670: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
d680: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
d690: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
d6a0: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
d6b0: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
d6c0: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
d6d0: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
d6e0: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
d6f0: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
d700: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
d710: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
d720: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
d730: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
d740: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
d750: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
d760: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
d770: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
d780: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
d790: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
d7a0: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
d7b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
d7c0: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  ]);.  assert( to
d7d0: 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  p<=(int)pPage->p
d7e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
d7f0: 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20  ; /* Prevent by 
d800: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29  getAndInitPage()
d810: 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f   */.  if( gap>to
d820: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70  p ){.    if( top
d830: 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42  ==0 && pPage->pB
d840: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36  t->usableSize==6
d850: 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f  5536 ){.      to
d860: 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d  p = 65536;.    }
d870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
d880: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d890: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
d8a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
d8b0: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
d8c0: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
d8d0: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
d8e0: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
d8f0: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
d900: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
d910: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
d920: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
d930: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
d940: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
d950: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
d960: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
d970: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
d980: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
d990: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
d9a0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
d9b0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
d9c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
d9d0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
d9e0: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
d9f0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
da00: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
da10: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
da20: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
da30: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
da40: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
da50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
da60: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
da70: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
da80: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
da90: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
daa0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
dab0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dac0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
dad0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
dae0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
daf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
db00: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
db10: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
db20: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
db30: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
db40: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
db50: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
db60: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
db70: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
db80: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
db90: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
dba0: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
dbb0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
dbc0: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
dbd0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
dbe0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
dbf0: 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e  , MIN(4, pPage->
dc00: 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65  nFree - (2+nByte
dc10: 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
dc20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
dc30: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
dc40: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
dc50: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
dc60: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74  ( gap+2+nByte<=t
dc70: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
dc80: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
dc90: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
dca0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
dcb0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
dcc0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
dcd0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
dce0: 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61   The btreeInitPa
dcf0: 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c  ge() call has al
dd00: 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64  ready.  ** valid
dd10: 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73  ated the freelis
dd20: 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74  t.  Given that t
dd30: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76  he freelist is v
dd40: 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a  alid, there.  **
dd50: 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
dd60: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  the allocation c
dd70: 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68  an extend off th
dd80: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
dd90: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65  e..  ** The asse
dda0: 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66  rt() below verif
ddb0: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
ddc0: 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a   sentence..  */.
ddd0: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
dde0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ddf0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
de00: 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79   assert( top+nBy
de10: 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  te <= (int)pPage
de20: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
de30: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
de40: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
de50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
de60: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
de70: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
de80: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
de90: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
dea0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
deb0: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
dec0: 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69  s pPage->aData[i
ded0: 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  Start].** and th
dee0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
def0: 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74  ock is iSize byt
df00: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65  es..**.** Adjace
df10: 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72  nt freeblocks ar
df20: 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a  e coalesced..**.
df30: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65  ** Note that eve
df40: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
df50: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
df60: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
df70: 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74  InitPage(),.** t
df80: 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  hat routine will
df90: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
dfa0: 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  lap between cell
dfb0: 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e  s or freeblocks.
dfc0: 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74    Nor.** does it
dfd0: 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72   detect cells or
dfe0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
dff0: 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74   encrouch into t
e000: 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65  he reserved byte
e010: 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
e020: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f  of the page.  So
e030: 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   do additional c
e040: 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73  orruption checks
e050: 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20   inside this.** 
e060: 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75  routine and retu
e070: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e080: 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d  T if any problem
e090: 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  s are found..*/.
e0a0: 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53  static int freeS
e0b0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
e0c0: 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c  age, u16 iStart,
e0d0: 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75   u16 iSize){.  u
e0e0: 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20  16 iPtr;        
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e110: 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66  of ptr to next f
e120: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31  reeblock */.  u1
e130: 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20  6 iFreeBlk;     
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e160: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62  f the next freeb
e170: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72  lock */.  u8 hdr
e180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73  /* Page header s
e1b0: 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a  ize.  0 or 100 *
e1c0: 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30  /.  u8 nFrag = 0
e1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64            /* Red
e1f0: 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65  uction in fragme
e200: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36  ntation */.  u16
e210: 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69   iOrigSize = iSi
e220: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
e230: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
e240: 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f  alue of iSize */
e250: 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20 20 20  .  u16 x;       
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
e280: 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
e290: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 33 32  nt area */.  u32
e2a0: 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
e2b0: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
e2c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
e2d0: 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74   past the iStart
e2e0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73   buffer */.  uns
e2f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
e300: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
e310: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65     /* Page conte
e320: 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
e330: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
e340: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e350: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
e360: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
e370: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
e380: 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
e390: 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  Start>=pPage->hd
e3a0: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
e3b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
e3c0: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
e3d0: 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d  PT_DB || iEnd <=
e3e0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
e3f0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
e400: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e410: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
e420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e430: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
e440: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
e450: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
e460: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
e470: 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  art<=pPage->pBt-
e480: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
e490: 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20  ..  /* The list 
e4a0: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75  of freeblocks mu
e4b0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
e4c0: 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20  ng order.  Find 
e4d0: 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f  the .  ** spot o
e4e0: 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65  n the list where
e4f0: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
e500: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  e inserted..  */
e510: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
e520: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74  hdrOffset;.  iPt
e530: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
e540: 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d  f( data[iPtr+1]=
e550: 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d  =0 && data[iPtr]
e560: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65  ==0 ){.    iFree
e570: 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f  Blk = 0;  /* Sho
e580: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61  rtcut for the ca
e590: 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65  se when the free
e5a0: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f  list is empty */
e5b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
e5c0: 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d  ile( (iFreeBlk =
e5d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e5e0: 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29  iPtr]))<iStart )
e5f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  {.      if( iFre
e600: 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20  eBlk<iPtr+4 ){. 
e610: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65         if( iFree
e620: 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Blk==0 ) break;.
e630: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e640: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e650: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
e660: 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20   }.      iPtr = 
e670: 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a  iFreeBlk;.    }.
e680: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e690: 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
e6a0: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
e6b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e6c0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
e6d0: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
e6e0: 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b  assert( iFreeBlk
e6f0: 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c  >iPtr || iFreeBl
e700: 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f  k==0 );.  .    /
e710: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a  * At this point:
e720: 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65  .    **    iFree
e730: 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65  Blk:   First fre
e740: 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74  eblock after iSt
e750: 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  art, or zero if 
e760: 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69  none.    **    i
e770: 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61  Ptr:       The a
e780: 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e  ddress of a poin
e790: 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a  ter to iFreeBlk.
e7a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68      **.    ** Ch
e7b0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46  eck to see if iF
e7c0: 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65  reeBlk should be
e7d0: 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20   coalesced onto 
e7e0: 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72  the end of iStar
e7f0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
e800: 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45  ( iFreeBlk && iE
e810: 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29  nd+3>=iFreeBlk )
e820: 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20  {.      nFrag = 
e830: 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b  iFreeBlk - iEnd;
e840: 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e  .      if( iEnd>
e850: 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72  iFreeBlk ) retur
e860: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e870: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
e880: 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65      iEnd = iFree
e890: 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26  Blk + get2byte(&
e8a0: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d  data[iFreeBlk+2]
e8b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  );.      if( iEn
e8c0: 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  d > pPage->pBt->
e8d0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
e8e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e8f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
e900: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
e910: 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69  .      iSize = i
e920: 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  End - iStart;.  
e930: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67      iFreeBlk = g
e940: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
e950: 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a  reeBlk]);.    }.
e960: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74    .    /* If iPt
e970: 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65  r is another fre
e980: 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c  eblock (that is,
e990: 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20   if iPtr is not 
e9a0: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20  the freelist.   
e9b0: 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74   ** pointer in t
e9c0: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20  he page header) 
e9d0: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
e9e0: 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75  e if iStart shou
e9f0: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61  ld be.    ** coa
ea00: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
ea10: 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20  end of iPtr..   
ea20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72   */.    if( iPtr
ea30: 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20  >hdr+1 ){.      
ea40: 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50  int iPtrEnd = iP
ea50: 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  tr + get2byte(&d
ea60: 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20  ata[iPtr+2]);.  
ea70: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b      if( iPtrEnd+
ea80: 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20  3>=iStart ){.   
ea90: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
eaa0: 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >iStart ) return
eab0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
eac0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
ead0: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
eae0: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
eaf0: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
eb00: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
eb10: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
eb20: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
eb30: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
eb40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
eb50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
eb60: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
eb70: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
eb80: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
eb90: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
eba0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
ebb0: 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29 7b 0a  f( iStart<=x ){.
ebc0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
ebd0: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
ebe0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
ebf0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ec00: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
ec10: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
ec20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ec30: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
ec40: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
ec50: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
ec60: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
ec70: 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74 72 21  Start<x || iPtr!
ec80: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
ec90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
eca0: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
ecb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ecc0: 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29  dr+1], iFreeBlk)
ecd0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
ece0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e  data[hdr+5], iEn
ecf0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
ed00: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
ed10: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74  ew freeblock int
ed20: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  o the freelist *
ed30: 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  /.    put2byte(&
ed40: 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61  data[iPtr], iSta
ed50: 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rt);.  }.  if( p
ed60: 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  Page->pBt->btsFl
ed70: 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
ed80: 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ECURE ){.    /* 
ed90: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
eda0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
edb0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
edc0: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
edd0: 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73      ** option is
ede0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20   enabled */.    
edf0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
ee00: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
ee10: 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
ee20: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69  &data[iStart], i
ee30: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74 32  FreeBlk);.  put2
ee40: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
ee50: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
ee60: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
ee70: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
ee80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ee90: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
eea0: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
eeb0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
eec0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
eed0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
eee0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
eef0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
ef00: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
ef10: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
ef20: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
ef30: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
ef40: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
ef50: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
ef60: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
ef70: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
ef80: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
ef90: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
efa0: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
efb0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
efc0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
efd0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
efe0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
eff0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
f000: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
f010: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
f020: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
f030: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
f040: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
f050: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f060: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
f070: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
f080: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
f090: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
f0a0: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
f0b0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
f0c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f0d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
f0e0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
f0f0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
f100: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
f110: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
f120: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
f130: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
f140: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
f150: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
f160: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
f170: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
f180: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
f190: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
f1a0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
f1b0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
f1c0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
f1d0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
f1e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37  VIDENCE-OF: R-07
f1f0: 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75  291-35328 A valu
f200: 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65  e of 5 (0x05) me
f210: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
f220: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
f230: 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  or table b-tree 
f240: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
f250: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
f260: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
f270: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
f280: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30  ENCE-OF: R-26900
f290: 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f  -09176 A value o
f2a0: 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e  f 13 (0x0d) mean
f2b0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
f2c0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c      ** leaf tabl
f2d0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
f2e0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f2f0: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
f300: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
f310: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
f320: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
f330: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
f340: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
f350: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
f360: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
f370: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
f380: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a  eeParseCellPtr;.
f390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f3a0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
f3b0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  af = 0;.      pP
f3c0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
f3d0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
f3e0: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
f3f0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
f400: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
f410: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
f420: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
f430: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
f440: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
f450: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f460: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
f470: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
f480: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
f490: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f4a0: 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33  -OF: R-43316-373
f4b0: 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  08 A value of 2 
f4c0: 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65  (0x02) means the
f4d0: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
f4e0: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65  ** interior inde
f4f0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f500: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f510: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
f520: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
f530: 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34  CE-OF: R-59615-4
f540: 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  2828 A value of 
f550: 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20  10 (0x0a) means 
f560: 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
f570: 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20    ** leaf index 
f580: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
f590: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
f5a0: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
f5b0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
f5c0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
f5d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
f5e0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
f5f0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
f600: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
f610: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
f620: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f630: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
f640: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
f650: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
f660: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
f670: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f680: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
f690: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
f6a0: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
f6b0: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
f6c0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
f6d0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
f6e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
f6f0: 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  (pPage);.  }.  p
f700: 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
f710: 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78  yload = pBt->max
f720: 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20  1bytePayload;.  
f730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
f750: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
f760: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
f770: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
f780: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
f790: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
f7a0: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
f7b0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
f7c0: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
f7d0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
f7e0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
f7f0: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
f800: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
f810: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
f820: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
f830: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
f840: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
f850: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
f860: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
f870: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
f880: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
f890: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
f8a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
f8b0: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
f8c0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
f8d0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
f8e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
f8f0: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
f900: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
f910: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
f920: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f930: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
f940: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
f950: 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
f960: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
f970: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
f980: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
f990: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
f9a0: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
f9b0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
f9c0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
f9d0: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
f9e0: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
f9f0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 63   page */.  u16 c
fa00: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
fa10: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
fa20: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
fa30: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
fa40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
fa50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fa60: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
fa70: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
fa80: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
fa90: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
faa0: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
fab0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
fac0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
fad0: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
fae0: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
faf0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
fb00: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
fb10: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
fb20: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
fb30: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
fb40: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
fb50: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
fb60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fb70: 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29  ge->pBt->db!=0 )
fb80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fb90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fba0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
fbb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
fbc0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
fbd0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
fbe0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
fbf0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
fc00: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
fc10: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
fc20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
fc30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
fc40: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
fc50: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
fc60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fc70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
fc80: 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  e->isInit==0 );.
fc90: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
fca0: 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  pBt;.  hdr = pPa
fcb0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
fcc0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
fcd0: 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45  Data;.  /* EVIDE
fce0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d  NCE-OF: R-28594-
fcf0: 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79  02890 The one-by
fd00: 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65  te flag at offse
fd10: 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20  t 0 indicating. 
fd20: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
fd30: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69  age type. */.  i
fd40: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
fd50: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
fd60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
fd80: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
fd90: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
fda0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
fdb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
fdc0: 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
fdd0: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
fde0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
fdf0: 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f   1);.  pPage->nO
fe00: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75  verflow = 0;.  u
fe10: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
fe20: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70  >usableSize;.  p
fe30: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
fe40: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
fe50: 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d  hdr + 8 + pPage-
fe60: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
fe70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
fe80: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
fe90: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
fea0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
feb0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70  cellOffset];.  p
fec0: 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20  Page->aDataOfst 
fed0: 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
fee0: 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
fef0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
ff00: 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68  R-58015-48175 Th
ff10: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
ff20: 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64  er at offset 5 d
ff30: 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74  esignates.  ** t
ff40: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
ff50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
ff60: 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20  a. A zero value 
ff70: 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72  for this integer
ff80: 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72   is.  ** interpr
ff90: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
ffa0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
ffb0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
ffc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56  hdr+5]);.  /* EV
ffd0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30  IDENCE-OF: R-370
ffe0: 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f  02-32774 The two
fff0: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
10000 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20   offset 3 gives 
10010 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
10020 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
10030 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65  page. */.  pPage
10040 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
10050 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
10060 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
10070 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
10080 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d  ) ){.    /* To m
10090 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
100a0 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
100b0 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
100c0 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
100d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
100e0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
100f0 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
10100 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
10110 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
10120 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10130 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49   R-24089-57979 I
10140 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  f a page contain
10150 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63  s no cells (whic
10160 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70  h is only.  ** p
10170 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f  ossible for a ro
10180 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot page of a tab
10190 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
101a0 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74   no rows) then t
101b0 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 74  he.  ** offset t
101c0 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
101d0 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75  nt area will equ
101e0 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  al the page size
101f0 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20   minus the.  ** 
10200 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65  bytes of reserve
10210 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73  d space. */.  as
10220 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
10230 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
10240 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
10250 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a 20 41  PT_DB );..  /* A
10260 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62   malformed datab
10270 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63  ase page might c
10280 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20  ause us to read 
10290 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  past the end.  *
102a0 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
102b0 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
102c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
102d0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
102e0 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
102f0 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
10300 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 2a  cell extends.  *
10310 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
10320 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  f a page boundar
10330 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c  y and causes SQL
10340 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62  ITE_CORRUPT to b
10350 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  e .  ** returned
10360 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   if it does..  *
10370 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  /.  iCellFirst =
10380 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
10390 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
103a0 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
103b0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66  leSize - 4;.  if
103c0 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
103d0 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
103e0 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  zeCk ){.    int 
103f0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
10400 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
10410 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
10420 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ay */.    int sz
10430 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
10440 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
10450 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
10460 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
10470 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  st--;.    for(i=
10480 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
10490 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
104a0 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  c = get2byteAlig
104b0 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ned(&data[cellOf
104c0 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
104d0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
104e0 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
104f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10500 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
10510 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
10520 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
10530 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10550 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10560 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
10570 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
10580 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
10590 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
105a0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
105b0 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
105c0 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a  .      if( pc+sz
105d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
105e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
105f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10600 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
10610 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10620 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
10630 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20  CellLast++;.  } 
10640 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20   ..  /* Compute 
10650 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
10660 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
10670 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  ** EVIDENCE-O
10680 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
10690 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
106a0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
106b0 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  1 gives the.  **
106c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
106d0 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
106e0 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
106f0 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
10700 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62  re no.  ** freeb
10710 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d  locks. */.  pc =
10720 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10730 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
10740 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
10750 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e   top;  /* Init n
10760 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65  Free to non-free
10770 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65  block free space
10780 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29   */.  if( pc>0 )
10790 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20  {.    u32 next, 
107a0 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
107b0 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20  <iCellFirst ){. 
107c0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
107d0 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39  -OF: R-55530-529
107e0 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  30 In a well-for
107f0 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
10800 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20   there will.    
10810 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
10820 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
10830 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
10840 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
10850 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
10860 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10870 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 20 0a  T_PAGE(pPage); .
10880 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
10890 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   1 ){.      if( 
108a0 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
108b0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62          /* Freeb
108c0 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64  lock off the end
108d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
108e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
108f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10900 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
10910 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
10920 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
10930 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
10940 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10950 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e  [pc+2]);.      n
10960 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
10970 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
10980 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
10990 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63   break;.      pc
109a0 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20   = next;.    }. 
109b0 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b     if( next>0 ){
109c0 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c  .      /* Freebl
109d0 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e  ock not in ascen
109e0 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
109f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10a00 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10a10 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
10a20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e   if( pc+size>(un
10a30 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c  signed int)usabl
10a40 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
10a50 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b  * Last freeblock
10a60 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70 61   extends past pa
10a70 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20  ge end */.      
10a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10a90 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
10ab0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
10ac0 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
10ad0 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10ae0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
10af0 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
10b00 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
10b10 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
10b20 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
10b30 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
10b40 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
10b50 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
10b60 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
10b70 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20  sable-size.  ** 
10b80 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
10b90 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
10ba0 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
10bb0 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
10bc0 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
10bd0 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
10be0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
10bf0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
10c00 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20  tent.  ** area, 
10c10 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
10c20 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
10c30 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
10c40 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ge..  */.  if( n
10c50 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
10c60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10c70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10c80 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
10c90 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
10ca0 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
10cb0 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61 67  llFirst);.  pPag
10cc0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
10cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10ce0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
10cf0 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
10d00 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
10d10 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
10d20 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
10d30 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
10d40 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
10d50 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
10d60 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
10d70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10d80 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
10d90 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
10da0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
10db0 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
10dc0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
10dd0 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
10de0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
10df0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
10e00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
10e10 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
10e20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10e30 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
10e40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
10e50 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
10e60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10e70 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
10e80 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
10e90 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
10ea0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
10eb0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
10ec0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
10ed0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10ee0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10ef0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
10f00 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
10f10 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
10f20 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
10f30 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
10f40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
10f50 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
10f60 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
10f70 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
10f80 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
10f90 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
10fa0 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
10fb0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
10fc0 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
10fd0 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
10fe0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
10ff0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
11000 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
11010 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
11020 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
11030 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
11040 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
11050 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
11060 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
11070 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
11080 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
11090 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
110a0 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
110b0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
110c0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
110d0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
110e0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
110f0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
11100 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
11110 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
11120 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
11130 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
11140 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
11150 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
11160 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
11170 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
11180 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
11190 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
111a0 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
111b0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
111c0 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
111d0 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
111e0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
111f0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
11200 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
11210 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
11220 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
11230 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
11240 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
11250 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
11260 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11270 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
11280 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65   if( pgno!=pPage
11290 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
112a0 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
112b0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
112c0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70  (pDbPage);.    p
112d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
112e0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61  pDbPage;.    pPa
112f0 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
11300 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
11310 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65   pgno;.    pPage
11320 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67  ->hdrOffset = pg
11330 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
11340 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
11350 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  Page->aData==sql
11360 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11370 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  (pDbPage) );.  r
11380 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
11390 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
113a0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
113b0 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
113c0 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
113d0 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
113e0 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
113f0 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f  eeded.  See also
11400 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  : btreeGetUnused
11410 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
11420 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
11430 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73  OCONTENT flag is
11440 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
11450 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
11460 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  re.** about the 
11470 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
11480 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
11490 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
114a0 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
114b0 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
114c0 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
114d0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
114e0 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
114f0 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
11500 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
11510 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
11520 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
11530 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
11540 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
11550 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
11560 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
11570 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
11580 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
11590 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
115a0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
115b0 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
115c0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
115d0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
115e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
115f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11600 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
11610 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
11620 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
11630 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
11640 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
11650 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
11660 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
11670 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
11680 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
11690 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
116a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
116b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
116c0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
116d0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ==0 || flags==PA
116e0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
116f0 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  T || flags==PAGE
11700 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29  R_GET_READONLY )
11710 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11720 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11730 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11740 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11750 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
11760 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
11770 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
11780 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
11790 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
117a0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
117b0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
117c0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
117d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
117e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
117f0 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
11800 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11810 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
11820 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
11830 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
11840 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
11850 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
11860 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
11870 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
11880 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
11890 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
118a0 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
118b0 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
118c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
118d0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
118e0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
118f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11900 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11910 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
11920 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
11930 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
11940 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
11950 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
11960 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
11970 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
11980 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
11990 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
119a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
119b0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
119c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
119d0 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
119e0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
119f0 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
11a00 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
11a10 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
11a20 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
11a30 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
11a40 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
11a50 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
11a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
11a70 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
11a80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11a90 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
11aa0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
11ab0 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
11ac0 65 29 26 30 78 38 30 30 30 30 30 30 30 29 3d 3d  e)&0x80000000)==
11ad0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74  0 );.  return bt
11ae0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
11af0 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
11b00 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
11b10 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
11b20 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a  tialize it..**.*
11b30 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65  * If pCur!=0 the
11b40 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
11b50 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70  ing fetched as p
11b60 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43  art of a moveToC
11b70 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20  hild().** call. 
11b80 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73   Do additional s
11b90 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
11ba0 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
11bb0 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20  is case..** And 
11bc0 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69  if the fetch fai
11bd0 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ls, this routine
11be0 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20   must decrement 
11bf0 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a  pCur->iPage..**.
11c00 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66  ** The page is f
11c10 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77  etched as read-w
11c20 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72  rite unless pCur
11c30 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
11c40 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e   is.** a read-on
11c50 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ly cursor..**.**
11c60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11c70 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  urs, then *ppPag
11c80 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
11c90 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
11ca0 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
11cb0 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
11cc0 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
11cd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11ce0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
11cf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
11d20 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
11d30 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
11d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11d50 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
11d60 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
11d70 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d90 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
11da0 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
11db0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
11dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11dd0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
11de0 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c  eceive the page,
11df0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
11e00 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20  t bReadOnly     
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e20 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
11e30 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b  -only page */.){
11e40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
11e50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
11e60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11e70 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11e80 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11e90 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
11ea0 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50  pPage==&pCur->pP
11eb0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
11ec0 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61   pCur==0 || bRea
11ed0 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72  dOnly==pCur->cur
11ee0 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20  PagerFlags );.  
11ef0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
11f00 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  || pCur->iPage>0
11f10 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
11f20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
11f30 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
11f40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11f50 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  KPT;.    goto ge
11f60 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11f70 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  or;.  }.  rc = s
11f80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
11f90 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
11fa0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
11fb0 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29  Page, bReadOnly)
11fc0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
11fd0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11fe0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11ff0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65  .  *ppPage = (Me
12000 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
12010 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
12020 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70  age);.  if( (*pp
12030 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
12040 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67   ){.    btreePag
12050 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
12060 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
12070 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
12080 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
12090 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
120a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
120b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
120c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Page);.      got
120d0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
120e0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
120f0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
12100 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
12110 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
12120 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d  *ppPage)->aData=
12130 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
12140 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
12150 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e  ..  /* If obtain
12160 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67 65  ing a child page
12170 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77   for a cursor, w
12180 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74 68  e must verify th
12190 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  at the page is. 
121a0 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   ** compatible w
121b0 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ith the root pag
121c0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  e. */.  if( pCur
121d0 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e   && ((*ppPage)->
121e0 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50  nCell<1 || (*ppP
121f0 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  age)->intKey!=pC
12200 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29  ur->curIntKey) )
12210 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12220 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
12230 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  gno);.    releas
12240 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
12250 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12260 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
12270 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12280 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
12290 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
122a0 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
122b0 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
122c0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
122d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
122e0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a  ur->iPage];.  }.
122f0 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
12300 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
12310 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
12320 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
12330 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12340 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
12350 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
12360 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
12370 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
12380 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
12390 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
123a0 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20  *.** Page1 is a 
123b0 73 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64  special case and
123c0 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
123d0 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50  d using releaseP
123e0 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61  ageOne()..*/.sta
123f0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
12400 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
12410 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
12420 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
12430 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
12440 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
12450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12460 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
12470 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12480 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
12490 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
124a0 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
124b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
124c0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
124d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
124e0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
124f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12500 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12510 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
12520 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
12530 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
12540 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
12550 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
12560 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
12570 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
12580 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
12590 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
125a0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
125b0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d  releasePageOne(M
125c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
125d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
125e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
125f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
12600 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12610 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
12620 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
12630 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12640 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
12650 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
12660 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
12670 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
12680 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
12690 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
126a0 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
126b0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
126c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
126d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
126e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
126f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61  ite3PagerUnrefPa
12700 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62  geOne(pPage->pDb
12710 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
12720 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
12730 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
12740 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
12750 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
12760 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
12770 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
12780 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
12790 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
127a0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
127b0 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
127c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
127d0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
127e0 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
127f0 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
12800 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
12810 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
12820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12830 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
12840 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
12850 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
12860 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
12870 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
12880 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
12890 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
128a0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
128b0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
128c0 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
128d0 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
128e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
128f0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
12900 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
12910 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
12920 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
12930 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
12940 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
12950 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
12960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12970 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
12980 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
12990 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
129a0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
129b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
129c0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
129d0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
129e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
129f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
12a00 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
12a10 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
12a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
12a30 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
12a40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
12a50 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
12a60 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
12a70 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
12a80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
12a90 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
12aa0 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
12ab0 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
12ac0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
12ad0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
12ae0 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
12af0 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
12b00 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
12b10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12b20 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
12b30 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
12b40 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
12b50 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
12b60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
12b70 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
12b80 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
12b90 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
12ba0 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
12bb0 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
12bc0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
12bd0 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
12be0 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
12bf0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
12c00 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
12c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12c20 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
12c30 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
12c40 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
12c50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12c60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12c70 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
12c80 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
12c90 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
12ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12cb0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
12cc0 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
12cd0 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
12ce0 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
12cf0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
12d00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
12d10 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
12d20 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
12d30 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
12d40 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
12d50 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
12d60 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
12d70 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
12d80 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
12d90 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
12da0 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
12db0 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
12dc0 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
12dd0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
12de0 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
12df0 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
12e00 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
12e10 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
12e20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
12e30 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
12e40 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
12e50 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
12e60 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
12e70 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
12e80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12e90 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
12ea0 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
12eb0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
12ec0 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
12ed0 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
12ee0 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
12ef0 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
12f00 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
12f10 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
12f20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12f30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12f40 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
12f50 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12f60 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
12f70 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
12f80 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20  Handler,.       
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12fb0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
12fc0 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a  >pPager));.}../*
12fd0 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
12fe0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
12ff0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
13000 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
13010 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
13020 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
13030 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
13040 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
13050 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
13060 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
13070 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
13080 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
13090 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
130a0 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
130b0 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
130c0 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
130d0 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
130e0 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
130f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13100 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
13110 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
13120 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
13130 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
13140 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
13150 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
13160 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
13170 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
13180 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13190 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
131a0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
131b0 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
131c0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
131d0 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
131e0 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
131f0 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
13200 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
13210 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
13220 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
13230 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
13240 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
13250 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13260 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
13270 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
13280 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
13290 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
132a0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
132b0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
132c0 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
132d0 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
132e0 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
132f0 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
13300 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13310 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
13320 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
13330 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
13340 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
13350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
13360 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
13370 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
13380 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
13390 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
133a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
133b0 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
133c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
133d0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
133e0 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
133f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
13400 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
13410 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
13420 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
13430 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
13440 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13450 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
13460 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
13470 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13490 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
134a0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
134b0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
134c0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
134d0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
134e0 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
134f0 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
13500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
13510 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
13520 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
13530 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
13560 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
13570 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
13580 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
13590 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
135a0 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
135b0 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
135c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
135d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
135e0 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
135f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
13600 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13620 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
13630 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
13640 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
13650 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
13660 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
13670 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
13680 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
13690 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
136a0 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
136b0 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
136c0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
136d0 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
136e0 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
136f0 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
13700 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
13710 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
13720 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
13730 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
13740 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
13750 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
13760 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
13770 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
13780 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
13790 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
137a0 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
137b0 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
137c0 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
137d0 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
137e0 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
13810 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
13820 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
13850 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
13860 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
13870 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
13880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
13890 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
138a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
138b0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
138c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
138d0 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
138e0 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
138f0 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
13900 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
13910 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
13920 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
13930 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
13940 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
13950 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
13960 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
13970 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
13980 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
13990 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
139a0 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
139b0 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
139c0 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
139d0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
139e0 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
139f0 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
13a00 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
13a10 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
13a20 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
13a30 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
13a40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
13a50 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
13a60 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
13a70 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
13a80 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
13a90 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
13aa0 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
13ab0 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
13ac0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
13ad0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
13ae0 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
13af0 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
13b00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
13b10 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  T;.  }.  p->inTr
13b20 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
13b30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
13b40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13b50 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
13b60 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
13b70 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
13b80 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
13b90 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
13ba0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
13bb0 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
13bc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13bd0 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
13be0 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
13bf0 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
13c00 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
13c10 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
13c20 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
13c30 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
13c40 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
13c50 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
13c60 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
13c70 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
13c80 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
13c90 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
13ca0 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
13cb0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13cc0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
13cd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c  {.      int nFil
13ce0 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  ename = sqlite3S
13cf0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
13d00 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  e)+1;.      int 
13d10 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
13d20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
13d30 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
13d40 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
13d50 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41  sqlite3Malloc(MA
13d60 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  X(nFullPathname,
13d70 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  nFilename));.   
13d80 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
13d90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
13da0 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20  utexShared; ).. 
13db0 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
13dc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
13dd0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
13de0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13df0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
13e00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13e10 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
13e20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
13e30 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
13e40 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
13e50 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
13e60 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
13e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13e80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13e90 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
13ea0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
13ee0 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
13ef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13f10 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
13f20 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
13f30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13f40 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
13f50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13f60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
13f70 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
13f80 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
13f90 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
13fa0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
13fb0 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
13fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13fd0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13fe0 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
13ff0 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
14000 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14010 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14020 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
14030 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14040 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
14050 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
14060 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
14070 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14080 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14090 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
140a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
140b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
140c0 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
140d0 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
140e0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
140f0 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
14100 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
14110 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
14120 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
14130 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
14140 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
14150 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
14160 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
14170 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
14180 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
14190 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
141a0 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
141b0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
141c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
141d0 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
141e0 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
141f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14210 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14230 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14240 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14260 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
14270 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
14280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14290 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
142a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
142b0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
142c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
142d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
142e0 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
142f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
14300 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
14310 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14320 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14330 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14340 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
14350 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
14360 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
14370 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
14380 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
14390 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
143a0 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
143b0 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
143c0 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
143d0 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
143e0 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
143f0 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
14400 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
14410 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
14420 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
14430 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
14440 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
14450 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
14460 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
14470 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
14480 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
14490 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
144a0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
144b0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
144c0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
144d0 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
144e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
144f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
14500 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
14510 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
14520 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
14530 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
14540 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
14550 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
14560 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
14570 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
14580 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
14590 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
145a0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
145b0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
145c0 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
145d0 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
145e0 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
145f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
14600 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
14610 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14620 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
14630 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14640 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
14650 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
14660 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
14670 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
14680 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
14690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
146a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
146b0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
146c0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
146d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
146e0 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
146f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
14700 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65    sizeof(MemPage
14730 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  ), flags, vfsFla
14740 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
14750 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14770 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
14780 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
14790 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
147a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
147b0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
147c0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
147d0 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
147e0 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
147f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
14800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14810 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
14820 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
14830 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
14840 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
14850 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
14860 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
14870 50 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64  PagerSetBusyHand
14880 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
14890 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
148a0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
148b0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
148c0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
148d0 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
148e0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
148f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
14900 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
14910 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
14920 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
14930 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
14940 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14950 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20  SECURE_DELETE). 
14960 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14970 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
14980 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66  ELETE;.#elif def
14990 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54  ined(SQLITE_FAST
149a0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a  _SECURE_DELETE).
149b0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
149c0 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49  s |= BTS_OVERWRI
149d0 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  TE;.#endif.    /
149e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
149f0 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
14a00 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
14a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14a20 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
14a30 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
14a40 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
14a50 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
14a60 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
14a70 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
14a80 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
14a90 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
14aa0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
14ab0 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
14ac0 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
14ad0 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
14ae0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
14af0 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
14b00 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
14b10 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
14b20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
14b30 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
14b40 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
14b50 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
14b60 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
14b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14b80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
14b90 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
14ba0 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
14bb0 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
14bc0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
14bd0 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
14be0 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
14bf0 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
14c00 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
14c10 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
14c20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
14c30 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
14c40 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
14c50 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
14c60 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
14c70 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
14c80 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
14c90 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
14ca0 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
14cb0 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
14cc0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
14cd0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
14ce0 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
14cf0 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
14d00 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
14d10 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
14d20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
14d30 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
14d40 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
14d50 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
14d60 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
14d70 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
14d80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
14d90 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
14da0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
14db0 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
14dc0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
14dd0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  e{.      /* EVID
14de0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
14df0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
14e00 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
14e10 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  region is.      
14e20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
14e30 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
14e40 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
14e50 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
14e60 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a  t of 20.      **
14e70 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
14e80 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
14e90 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  */.      nReserv
14ea0 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
14eb0 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
14ec0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
14ed0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
14ee0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14ef0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14f00 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
14f10 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14f20 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
14f30 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
14f40 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14f50 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
14f60 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
14f70 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
14f80 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
14f90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
14fa0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
14fb0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
14fc0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
14fd0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
14fe0 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
14ff0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
15000 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
15010 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
15020 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
15030 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
15040 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
15050 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
15060 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
15070 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
15080 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
15090 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
150a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
150b0 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
150c0 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
150d0 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
150e0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
150f0 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
15100 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
15110 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66  nRef = 1;.    if
15120 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
15130 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
15140 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
15150 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
15160 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ).      MUTEX_LO
15170 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
15180 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
15190 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
151a0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
151b0 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
151c0 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
151d0 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
151e0 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
151f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
15200 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
15210 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15220 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
15230 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
15240 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
15250 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15260 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
15270 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
15280 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
15290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
152a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
152b0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
152c0 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
152d0 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
152e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
152f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15300 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
15310 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15320 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15330 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
15340 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15350 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
15360 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
15370 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
15380 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15390 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
153a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
153b0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
153c0 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
153d0 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
153e0 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
153f0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
15400 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
15410 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
15420 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
15430 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
15440 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
15450 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
15460 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
15470 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
15480 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
15490 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
154a0 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
154b0 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
154c0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
154d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
154e0 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
154f0 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
15500 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
15510 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
15520 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
15530 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
15540 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75  }.        if( (u
15550 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72  ptr)p->pBt<(uptr
15560 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  )pSib->pBt ){.  
15570 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15580 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
15590 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
155a0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
155b0 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
155c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
155d0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
155e0 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72  ->pNext && (uptr
155f0 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42  )pSib->pNext->pB
15600 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29  t<(uptr)p->pBt )
15610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
15620 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
15630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15640 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15650 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
15660 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
15670 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
15680 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
15690 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
156a0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
156b0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
156c0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
156d0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
156e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
156f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15700 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
15710 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
15720 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
15730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15740 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
15750 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
15760 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
15770 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
15780 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  ->pPager, 0);.  
15790 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
157a0 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
157b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
157c0 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
157d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
157e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
157f0 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  le;..    /* If t
15800 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
15810 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
15820 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
15830 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
15840 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
15850 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
15860 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
15870 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
15880 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
15890 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
158a0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
158b0 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
158c0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
158d0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
158e0 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
158f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
15900 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
15910 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
15920 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
15930 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20  _SIZE);.    }.. 
15940 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74     pFile = sqlit
15950 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
15960 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15970 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
15980 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
15990 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
159a0 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54  int(pFile, SQLIT
159b0 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f  E_FCNTL_PDB, (vo
159c0 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20  id*)&pBt->db);. 
159d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
159e0 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
159f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15a00 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
15a10 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
15a20 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15a30 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
15a40 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
15a50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
15a60 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69  te3BtreeConnecti
15a70 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65  onCount(*ppBtree
15a80 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  )>0 );.  return 
15a90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
15aa0 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
15ab0 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
15ac0 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
15ad0 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
15ae0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
15af0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
15b00 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
15b10 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
15b20 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
15b30 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
15b40 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
15b50 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
15b60 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
15b70 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
15b80 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
15b90 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
15ba0 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
15bb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15bc0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
15bd0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
15be0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
15bf0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
15c00 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
15c10 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
15c20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15c30 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
15c40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
15c50 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
15c60 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
15c70 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15c80 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
15c90 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
15ca0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
15cb0 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
15cc0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
15cd0 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
15ce0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
15cf0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15d00 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
15d10 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
15d20 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15d30 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15d40 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
15d50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15d60 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
15d70 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15d80 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15d90 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
15da0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
15db0 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
15dc0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
15dd0 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
15de0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
15df0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
15e00 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
15e10 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
15e20 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15e30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
15e40 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
15e50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15e60 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
15e70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
15e80 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
15e90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
15ea0 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
15eb0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
15ec0 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
15ed0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
15ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
15ef0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
15f00 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
15f10 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
15f20 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
15f30 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
15f40 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
15f50 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
15f60 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
15f70 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
15f80 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
15f90 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
15fa0 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
15fb0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
15fc0 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
15fd0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
15fe0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
15ff0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
16000 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
16010 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
16020 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
16030 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
16040 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
16050 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
16060 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
16070 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
16080 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
16090 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
160a0 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
160b0 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
160c0 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
160d0 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
160e0 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
160f0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
16100 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
16110 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
16120 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
16130 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
16140 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
16150 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
16160 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
16170 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
16180 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
16190 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
161a0 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
161b0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
161c0 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
161d0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
161e0 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
161f0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
16200 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
16210 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
16220 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
16230 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
16240 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
16250 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
16260 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
16270 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16280 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
16290 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
162a0 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
162b0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
162c0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
162d0 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
162e0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
162f0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
16300 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
16310 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
16320 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
16330 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
16340 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
16350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16360 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16370 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
16380 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
16390 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
163a0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
163b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
163c0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
163d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
163e0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
163f0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
16400 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
16410 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
16420 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
16430 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16440 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
16450 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
16460 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
16470 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
16480 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
16490 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
164a0 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
164b0 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
164c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
164d0 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
164e0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
164f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16500 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
16510 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
16520 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
16530 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
16540 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
16550 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16560 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
16570 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
16580 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
16590 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
165a0 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
165b0 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
165c0 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
165d0 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
165e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
165f0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
16600 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16610 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
16620 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
16630 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
16640 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
16650 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
16660 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
16670 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
16680 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
16690 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
166a0 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
166b0 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
166c0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
166d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
166e0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
166f0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
16700 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16710 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
16720 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
16730 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
16740 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
16750 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
16760 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
16770 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
16780 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
16790 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
167a0 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
167b0 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
167c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
167d0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
167e0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
167f0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
16800 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
16810 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
16820 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
16830 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
16840 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
16850 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
16860 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
16870 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
16880 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
16890 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
168a0 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
168b0 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
168c0 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
168d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
168e0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
168f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
16900 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
16910 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28   p->db);.    if(
16920 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
16930 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
16940 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
16950 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
16960 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
16970 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16980 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
16990 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
169a0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
169b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
169c0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
169d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
169e0 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
169f0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
16a00 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
16a10 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
16a20 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
16a30 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
16a40 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
16a50 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
16a60 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
16a70 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
16a80 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
16a90 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
16aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16ab0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
16ac0 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74  soft" limit on t
16ad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
16ae0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
16af0 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75  .** Unused and u
16b00 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20  nmodified pages 
16b10 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64  will be recycled
16b20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
16b30 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20   of.** pages in 
16b40 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64  the cache exceed
16b50 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69  s this soft limi
16b60 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65  t.  But the size
16b70 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65   of the.** cache
16b80 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67   is allowed to g
16b90 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20  row larger than 
16ba0 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74  this limit if it
16bb0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72   contains.** dir
16bc0 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65  ty pages or page
16bd0 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76  s still in activ
16be0 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e use..*/.int sq
16bf0 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
16c00 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
16c10 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
16c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16c30 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
16c40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16c50 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
16c60 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
16c70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16c80 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
16c90 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
16ca0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
16cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16cc0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16cd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16ce0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
16cf0 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20  spill" limit on 
16d00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16d10 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
16d20 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  ..** If the numb
16d30 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65  er of pages exce
16d40 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64  eds this limit d
16d50 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72  uring a write tr
16d60 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68  ansaction,.** th
16d70 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74  e pager might at
16d80 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22  tempt to "spill"
16d90 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f   pages to the jo
16da0 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a  urnal early in.*
16db0 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  * order to free 
16dc0 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  up memory..**.**
16dd0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
16de0 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65  ned is the curre
16df0 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20  nt spill size.  
16e00 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65  If zero is passe
16e10 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  d.** as an argum
16e20 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20  ent, no changes 
16e30 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
16e40 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69  spill size setti
16e50 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20  ng, so.** using 
16e60 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61  mxPage of 0 is a
16e70 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68   way to query th
16e80 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
16e90 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  size..*/.int sql
16ea0 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
16eb0 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  lSize(Btree *p, 
16ec0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
16ed0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16ee0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73  ->pBt;.  int res
16ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16f00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16f10 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
16f20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16f30 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20  ter(p);.  res = 
16f40 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
16f50 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50  pillsize(pBt->pP
16f60 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
16f70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16f80 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16f90 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  res;.}..#if SQLI
16fa0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
16fb0 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  >0./*.** Change 
16fc0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
16fd0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64   amount of the d
16fe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
16ff0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f  t may be.** memo
17000 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e  ry mapped..*/.in
17010 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
17020 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65  tMmapLimit(Btree
17030 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
17040 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74  64 szMmap){.  Bt
17050 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17060 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
17070 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17080 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
17090 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
170a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
170b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
170c0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
170d0 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73  er, szMmap);.  s
170e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
170f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
17100 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
17110 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
17120 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
17130 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17140 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
17150 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
17160 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
17170 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
17180 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
17190 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
171a0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
171b0 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
171c0 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
171d0 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
171e0 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
171f0 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
17200 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
17210 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
17220 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
17230 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
17240 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
17250 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
17260 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
17270 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
17280 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
17290 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
172a0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
172b0 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
172c0 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
172d0 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
172e0 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
172f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17300 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
17310 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17320 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20  SetPagerFlags(. 
17330 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
17340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
17350 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
17360 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
17370 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
17380 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56  Flags       /* V
17390 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66  arious PAGER_* f
173a0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  lags */.){.  BtS
173b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
173c0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
173d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
173e0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
173f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17400 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
17410 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
17420 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  s(pBt->pPager, p
17430 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  gFlags);.  sqlit
17440 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17450 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17460 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
17470 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17480 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
17490 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
174a0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
174b0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
174c0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
174d0 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
174e0 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
174f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17500 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
17510 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
17520 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
17530 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
17540 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
17550 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
17560 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
17570 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
17580 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
17590 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
175a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
175b0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
175c0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
175d0 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
175e0 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
175f0 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
17600 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
17610 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
17620 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
17630 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
17640 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
17650 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
17660 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
17670 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
17680 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
17690 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
176a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
176b0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
176c0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
176d0 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
176e0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
176f0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
17700 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
17710 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
17720 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
17730 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
17740 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
17750 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
17760 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
17770 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
17780 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
17790 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
177a0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
177b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
177c0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
177d0 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
177e0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
177f0 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
17800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17810 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17820 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
17830 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
17840 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
17850 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
17860 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
17870 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
17880 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
17890 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
178a0 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
178b0 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
178c0 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
178d0 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
178e0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
178f0 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
17900 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17910 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
17920 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
17930 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
17940 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
17950 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
17960 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
17970 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
17980 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
17990 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
179a0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
179b0 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
179c0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
179d0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
179e0 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
179f0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
17a00 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
17a10 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
17a20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
17a30 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
17a40 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
17a50 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
17a60 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
17a70 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
17a80 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
17a90 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
17aa0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
17ab0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
17ac0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
17ad0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
17ae0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
17af0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
17b00 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
17b10 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
17b20 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
17b30 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
17b40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17b50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17b60 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
17b70 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
17b80 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
17b90 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
17ba0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
17bb0 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
17bc0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
17bd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17be0 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
17bf0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
17c00 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
17c10 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
17c20 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
17c30 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
17c40 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
17c50 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
17c60 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
17c70 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
17c80 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
17c90 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
17ca0 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
17cb0 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
17cc0 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
17cd0 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
17ce0 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
17cf0 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
17d00 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
17d10 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
17d20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
17d30 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
17d40 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
17d50 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
17d60 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
17d70 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
17d80 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
17d90 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
17da0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
17db0 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
17dc0 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
17dd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17de0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
17df0 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
17e00 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
17e10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17e20 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
17e30 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
17e40 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
17e50 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
17e60 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
17e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17e80 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17e90 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
17ea0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
17eb0 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
17ec0 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
17ed0 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
17ee0 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
17ef0 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
17f00 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
17f10 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
17f20 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
17f30 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
17f40 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
17f50 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
17f60 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
17f70 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
17f80 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
17f90 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
17fa0 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
17fb0 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
17fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17fd0 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
17fe0 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
17ff0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
18000 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18010 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
18020 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
18030 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
18040 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
18050 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
18060 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
18070 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
18080 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
18090 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
180a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
180b0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
180c0 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
180d0 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
180e0 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
180f0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
18100 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
18110 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
18120 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
18130 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
18140 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
18150 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
18160 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
18170 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
18180 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
18190 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
181a0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
181b0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
181c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
181d0 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
181e0 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
181f0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
18200 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
18210 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18220 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
18230 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
18240 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  e values for the
18250 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18260 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  TE and BTS_OVERW
18270 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  RITE flags:.**.*
18280 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20  *    newFlag==0 
18290 20 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53        Both BTS_S
182a0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
182b0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61   BTS_OVERWRITE a
182c0 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20  re cleared.**   
182d0 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20   newFlag==1     
182e0 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c    BTS_SECURE_DEL
182f0 45 54 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f  ETE set and BTS_
18300 4f 56 45 52 57 52 49 54 45 20 69 73 20 63 6c 65  OVERWRITE is cle
18310 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
18320 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f  ag==2       BTS_
18330 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c  SECURE_DELETE cl
18340 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56  eared and BTS_OV
18350 45 52 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a  ERWRITE is set.*
18360 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d  *    newFlag==(-
18370 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73  1)    No changes
18380 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18390 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 71 75  ine acts as a qu
183a0 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69  ery if newFlag i
183b0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
183c0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f  .**.** With BTS_
183d0 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c 20 64  OVERWRITE set, d
183e0 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
183f0 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  s overwritten by
18400 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66   zeros, but.** f
18410 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
18420 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74  es are not writt
18430 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
18440 61 74 61 62 61 73 65 2e 20 20 54 68 75 73 20 69  atabase.  Thus i
18450 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65  n-page.** delete
18460 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65  d content is cle
18470 61 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69  ared, but freeli
18480 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  st deleted conte
18490 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  nt is not..**.**
184a0 20 57 69 74 68 20 42 54 53 5f 53 45 43 55 52 45   With BTS_SECURE
184b0 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69  _DELETE, operati
184c0 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f  on is like BTS_O
184d0 56 45 52 57 52 49 54 45 20 77 69 74 68 20 74 68  VERWRITE with th
184e0 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68  e addition.** th
184f0 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66  at freelist leaf
18500 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
18510 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
18520 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65   database, incre
18530 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f  asing.** the amo
18540 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e  unt of disk I/O.
18550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18560 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
18570 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
18580 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
18590 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
185a0 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
185b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
185c0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f  .  assert( BTS_O
185d0 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45  VERWRITE==BTS_SE
185e0 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b  CURE_DELETE*2 );
185f0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 46  .  assert( BTS_F
18600 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53  AST_SECURE==(BTS
18610 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53  _OVERWRITE|BTS_S
18620 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b  ECURE_DELETE) );
18630 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
18640 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
18650 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
18660 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20  S_FAST_SECURE;. 
18670 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
18680 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
18690 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67  E_DELETE*newFlag
186a0 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e  ;.  }.  b = (p->
186b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
186c0 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29  BTS_FAST_SECURE)
186d0 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  /BTS_SECURE_DELE
186e0 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  TE;.  sqlite3Btr
186f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18700 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
18710 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
18720 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
18730 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
18740 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
18750 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
18760 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
18770 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
18780 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
18790 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
187a0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
187b0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
187c0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
187d0 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
187e0 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
187f0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
18800 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
18810 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
18820 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
18830 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
18840 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
18850 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
18860 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18870 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
18880 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
18890 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
188a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
188b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
188c0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
188d0 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
188e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
188f0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
18900 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
18910 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
18920 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
18930 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
18940 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
18950 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
18960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
18970 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
18980 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
18990 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
189a0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
189b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
189c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
189d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
189e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
189f0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
18a00 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
18a10 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
18a20 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
18a30 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
18a40 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
18a50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
18a60 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
18a70 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
18a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18a90 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
18aa0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
18ab0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
18ac0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
18ad0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18ae0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
18af0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
18b00 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
18b10 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
18b20 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
18b30 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
18b40 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
18b50 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
18b60 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
18b70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
18b90 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  dif.}../*.** If 
18ba0 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74  the user has not
18bb0 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 2d   set the safety-
18bc0 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64  level for this d
18bd0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18be0 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41  on.** using "PRA
18bf0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22  GMA synchronous"
18c00 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73 61 66  , and if the saf
18c10 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74  ety-level is not
18c20 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
18c30 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
18c40 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
18c50 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f  tion as the seco
18c60 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a  nd parameter,.**
18c70 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23   set it so..*/.#
18c80 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
18c90 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
18ca0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
18cb0 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a  L_SYNCHRONOUS \.
18cc0 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28      && !defined(
18cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
18ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
18cf0 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
18d00 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75  BtShared *pBt, u
18d10 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b  8 safety_level){
18d20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18d30 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28    Db *pDb;.  if(
18d40 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30   (db=pBt->db)!=0
18d50 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62   && (pDb=db->aDb
18d60 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  )!=0 ){.    whil
18d70 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c  e( pDb->pBt==0 |
18d80 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21  | pDb->pBt->pBt!
18d90 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d  =pBt ){ pDb++; }
18da0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53  .    if( pDb->bS
18db0 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20  yncSet==0 .     
18dc0 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
18dd0 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76  evel!=safety_lev
18de0 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62 21  el .     && pDb!
18df0 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20  =&db->aDb[1] .  
18e00 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e    ){.      pDb->
18e10 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73  safety_level = s
18e20 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20  afety_level;.   
18e30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
18e40 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
18e50 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ger,.          p
18e60 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
18e70 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
18e80 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
18e90 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
18ea0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
18eb0 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
18ec0 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76  g(pBt,safety_lev
18ed0 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46  el).#endif../* F
18ee0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
18ef0 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
18f00 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
18f10 68 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  hared*);.../*.**
18f20 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
18f30 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
18f40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18f50 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
18f60 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
18f70 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
18f80 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
18f90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18fa0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
18fb0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
18fc0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
18fd0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
18fe0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
18ff0 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
19000 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
19010 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
19020 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
19030 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
19040 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
19050 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
19060 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
19070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
19080 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
19090 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
190b0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
190c0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
190d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
190e0 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
190f0 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
19100 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
19110 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
19120 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
19130 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
19140 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
19150 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
19160 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19170 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
19180 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
19190 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
191a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
191b0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
191c0 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
191d0 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
191e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
191f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
19200 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
19210 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
19220 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
19230 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
19240 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
19250 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19260 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19270 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
19280 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
19290 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
192a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
192b0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
192c0 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
192d0 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
192e0 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
192f0 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
19300 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
19310 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
19320 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
19330 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
19340 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
19350 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
19360 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
19370 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
19380 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
19390 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
193a0 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
193b0 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
193c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
193d0 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
193e0 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
193f0 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62  }.  if( (pBt->db
19400 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
19410 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29 21  _ResetDatabase)!
19420 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
19430 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
19440 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
19450 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
19460 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
19470 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
19480 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
19490 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
194a0 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
194b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
194c0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
194d0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
194e0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
194f0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
19500 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
19510 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
19520 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
19530 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
19540 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
19550 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
19560 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
19570 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
19580 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
19590 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
195a0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
195b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
195c0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
195d0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
195e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
195f0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
19600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
19610 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
19620 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19630 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19640 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
19650 61 67 65 31 5b 31 38 5d 3e 33 20 29 7b 0a 20 20  age1[18]>3 ){.  
19660 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
19670 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
19680 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
19690 28 20 70 61 67 65 31 5b 31 39 5d 3e 33 20 29 7b  ( page1[19]>3 ){
196a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
196b0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
196c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
196d0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
196e0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
196f0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
19700 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
19710 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
19720 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
19730 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
19740 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
19750 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
19760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
19770 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
19780 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
19790 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
197a0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
197b0 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
197c0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
197d0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
197e0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
197f0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
19800 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
19810 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
19820 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
19830 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
19840 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
19850 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
19860 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
19870 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
19880 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
19890 28 20 70 61 67 65 31 5b 31 39 5d 3e 3d 32 20 26  ( page1[19]>=2 &
198a0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
198b0 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
198c0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
198d0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
198e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
198f0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
19900 50 61 67 65 72 2c 20 28 70 61 67 65 31 5b 31 39  Pager, (page1[19
19910 5d 3d 3d 33 29 2c 20 26 69 73 4f 70 65 6e 29 3b  ]==3), &isOpen);
19920 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19940 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
19950 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
19960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19970 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
19980 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
19990 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
199a0 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
199b0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d      if( isOpen==
199c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
199d0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
199e0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
199f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a00 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
19a10 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
19a20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
19a30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19a40 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
19a50 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44  ag(pBt, SQLITE_D
19a60 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
19a70 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  US+1);.    }.#en
19a80 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44  dif..    /* EVID
19a90 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35  ENCE-OF: R-15465
19aa0 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d  -20813 The maxim
19ab0 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65  um and minimum e
19ac0 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a  mbedded payload.
19ad0 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73      ** fractions
19ae0 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61   and the leaf pa
19af0 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76  yload fraction v
19b00 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34  alues must be 64
19b10 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20  , 32, and 32..  
19b20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
19b30 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
19b40 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
19b50 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
19b60 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
19b70 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
19b80 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
19b90 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
19ba0 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
19bb0 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
19bc0 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
19bd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
19be0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
19bf0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
19c00 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19c10 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
19c20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
19c30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
19c40 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
19c50 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
19c60 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
19c70 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
19c80 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
19c90 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
19ca0 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
19cb0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
19cc0 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
19cd0 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
19ce0 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
19cf0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19d00 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20  : R-25008-21688 
19d10 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  The size of a pa
19d20 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ge is a power of
19d30 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77   two.    ** betw
19d40 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
19d50 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a  6 inclusive. */.
19d60 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
19d70 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
19d80 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
19d90 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
19da0 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
19db0 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
19dc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
19dd0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
19de0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
19df0 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
19e00 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
19e10 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19e20 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54   R-59310-51205 T
19e30 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61  he "reserved spa
19e40 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20  ce" size in the 
19e50 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e  1-byte.    ** in
19e60 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
19e70 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  20 is the number
19e80 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
19e90 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
19ea0 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67  .    ** each pag
19eb0 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  e to reserve for
19ec0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20   extensions. .  
19ed0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44    **.    ** EVID
19ee0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
19ef0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
19f00 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
19f10 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  region is.    **
19f20 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
19f30 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
19f40 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
19f50 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
19f60 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74  of 20.    ** int
19f70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
19f80 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
19f90 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
19fa0 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
19fb0 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
19fc0 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
19fd0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
19fe0 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
19ff0 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
1a000 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1a010 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
1a020 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
1a030 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
1a040 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
1a050 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
1a060 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
1a070 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
1a080 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
1a090 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
1a0a0 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
1a0b0 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
1a0c0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
1a0d0 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
1a0e0 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
1a0f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
1a100 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
1a110 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
1a120 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
1a130 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
1a140 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1a150 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
1a160 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
1a170 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
1a180 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1a190 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
1a1a0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
1a1b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a1c0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1a1d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
1a1e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
1a220 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
1a230 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1a240 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 72 69    if( sqlite3Wri
1a250 74 61 62 6c 65 53 63 68 65 6d 61 28 70 42 74 2d  tableSchema(pBt-
1a260 3e 64 62 29 3d 3d 30 20 26 26 20 6e 50 61 67 65  >db)==0 && nPage
1a270 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
1a280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a290 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a2a0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1a2b0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1a2c0 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
1a2d0 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34  E-OF: R-28312-64
1a2e0 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65  704 However, the
1a2f0 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20   usable size is 
1a300 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
1a310 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68     ** be less th
1a320 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72  an 480. In other
1a330 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70   words, if the p
1a340 61 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c  age size is 512,
1a350 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
1a360 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
1a370 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65  size cannot exce
1a380 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66  ed 32. */.    if
1a390 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
1a3a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1a3b0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1a3c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
1a3d0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
1a3e0 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
1a3f0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
1a400 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
1a410 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1a420 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
1a430 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
1a440 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
1a450 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
1a460 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
1a470 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
1a480 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
1a490 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
1a4a0 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
1a4b0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
1a4c0 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
1a4d0 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
1a4e0 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
1a4f0 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
1a500 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
1a510 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
1a520 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
1a530 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
1a540 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
1a550 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
1a560 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
1a570 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
1a580 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
1a590 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
1a5a0 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
1a5b0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
1a5c0 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
1a5d0 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
1a5e0 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
1a5f0 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
1a600 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
1a610 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
1a620 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
1a630 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
1a640 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
1a650 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
1a660 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
1a670 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
1a680 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
1a690 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
1a6a0 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
1a6b0 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
1a6c0 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
1a6d0 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
1a6e0 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
1a6f0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
1a700 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
1a710 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
1a720 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
1a730 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
1a740 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1a750 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
1a760 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
1a770 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
1a780 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1a790 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
1a7a0 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
1a7b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
1a7c0 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
1a7d0 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
1a7e0 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
1a7f0 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
1a800 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
1a810 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
1a820 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
1a830 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
1a840 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1a850 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
1a860 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
1a870 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
1a880 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
1a890 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
1a8a0 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
1a8b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
1a8c0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
1a8d0 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1a8e0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
1a8f0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
1a900 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1a910 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
1a920 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1a930 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
1a940 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
1a950 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
1a960 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
1a970 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
1a980 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
1a990 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
1a9a0 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
1a9b0 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
1a9c0 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
1a9d0 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
1a9e0 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
1a9f0 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
1aa00 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
1aa10 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
1aa20 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
1aa30 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
1aa40 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
1aa50 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
1aa60 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
1aa70 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
1aa80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1aa90 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
1aaa0 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
1aab0 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
1aac0 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
1aad0 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
1aae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1aaf0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
1ab00 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1ab10 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
1ab20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
1ab30 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
1ab40 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
1ab50 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
1ab60 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
1ab70 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
1ab80 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
1ab90 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
1aba0 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
1abb0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
1abc0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
1abd0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
1abe0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
1abf0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
1ac00 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
1ac10 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
1ac20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
1ac30 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
1ac40 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
1ac50 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
1ac60 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1ac70 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
1ac80 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
1ac90 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1aca0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1acb0 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
1acc0 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
1acd0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
1ace0 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
1acf0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
1ad00 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
1ad10 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
1ad20 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1ad30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
1ad40 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1ad50 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
1ad60 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1ad70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1ad80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1ad90 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
1ada0 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
1adb0 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
1adc0 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
1add0 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
1ade0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1adf0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
1ae00 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
1ae10 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
1ae20 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1ae30 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge1;.    assert(
1ae40 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29   pPage1->aData )
1ae50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1ae60 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1ae70 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
1ae80 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =1 );.    pBt->p
1ae90 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72  Page1 = 0;.    r
1aea0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1aeb0 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1aec0 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1aed0 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1aee0 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1aef0 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1af00 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1af10 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1af20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1af30 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1af40 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1af50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1af60 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1af70 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1af80 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1af90 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1afa0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1afb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1afc0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1afd0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1afe0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1aff0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b000 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1b010 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1b020 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1b030 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1b040 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1b050 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1b060 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1b070 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1b080 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1b090 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1b0a0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1b0b0 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1b0c0 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1b0d0 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1b0e0 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1b0f0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1b100 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1b110 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1b120 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1b130 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1b140 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1b150 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1b160 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1b170 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1b180 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1b190 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1b1a0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1b1b0 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1b1c0 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1b1d0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1b1e0 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1b1f0 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1b200 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1b210 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1b220 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1b230 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1b240 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1b250 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1b260 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1b270 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1b280 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1b290 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1b2a0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1b2b0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1b2c0 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1b2d0 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1b2e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1b2f0 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1b300 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1b310 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1b320 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1b330 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1b340 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1b350 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1b360 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1b370 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1b380 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1b390 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1b3a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b3b0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1b3c0 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1b3d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b3e0 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1b3f0 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1b400 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1b410 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1b420 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1b430 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1b440 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1b450 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1b460 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1b470 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1b480 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1b490 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1b4a0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1b4b0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1b4c0 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1b4d0 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1b4e0 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1b4f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b500 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1b510 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1b520 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1b530 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1b540 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1b550 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1b560 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1b570 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1b580 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1b590 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1b5a0 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1b5b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1b5c0 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1b5d0 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1b5e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1b5f0 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1b600 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1b610 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1b620 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1b630 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1b640 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1b650 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1b660 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1b670 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1b680 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1b690 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1b6a0 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1b6b0 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1b6c0 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1b6d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1b6e0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1b6f0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1b700 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1b710 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1b720 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1b730 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1b740 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1b750 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1b760 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1b770 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1b780 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1b790 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b7a0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1b7b0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1b7c0 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1b7d0 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1b7e0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1b7f0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1b800 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1b810 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1b820 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1b830 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1b840 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1b850 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1b860 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1b870 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1b880 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1b890 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1b8a0 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1b8b0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1b8c0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1b8d0 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1b8e0 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1b8f0 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1b900 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1b910 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1b920 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1b930 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1b940 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1b950 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1b960 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1b970 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1b980 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1b990 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1b9a0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1b9b0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1b9c0 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1b9d0 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1b9e0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1b9f0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1ba00 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1ba10 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1ba20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1ba30 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1ba40 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1ba50 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1ba60 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1ba70 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1ba80 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1ba90 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1baa0 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1bab0 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1bac0 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1bad0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1bae0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1baf0 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1bb00 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1bb10 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1bb20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1bb30 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1bb40 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1bb50 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1bb60 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1bb70 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1bb80 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1bb90 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1bba0 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1bbb0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1bbc0 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1bbd0 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 2c 20  *p, int wrflag, 
1bbe0 69 6e 74 20 2a 70 53 63 68 65 6d 61 56 65 72 73  int *pSchemaVers
1bbf0 69 6f 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ion){.  BtShared
1bc00 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1bc10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1bc20 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
1bc30 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1bc40 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1bc50 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
1bc60 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
1bc70 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
1bc80 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
1bc90 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
1bca0 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
1bcb0 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
1bcc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
1bcd0 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
1bce0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
1bcf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1bd00 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1bd10 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
1bd20 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
1bd30 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
1bd40 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1bd50 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  un;.  }.  assert
1bd60 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1bd70 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1bd80 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56  E || IfNotOmitAV
1bd90 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
1bda0 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  e)==0 );..  if( 
1bdb0 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (p->db->flags & 
1bdc0 53 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61  SQLITE_ResetData
1bdd0 62 61 73 65 29 20 0a 20 20 20 26 26 20 73 71 6c  base) .   && sql
1bde0 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
1bdf0 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
1be00 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 70 42  ==0 .  ){.    pB
1be10 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1be20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
1be30 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
1be40 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1be50 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
1be60 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
1be70 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
1be80 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1be90 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1bea0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1beb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1bec0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
1bed0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1bee0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1bef0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1bf00 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  CHE.  {.    sqli
1bf10 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
1bf20 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  .    /* If anoth
1bf30 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
1bf40 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
1bf50 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
1bf60 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
1bf70 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
1bf80 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
1bf90 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
1bfa0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1bfb0 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  is.    ** reques
1bfc0 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
1bfd0 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a  TE_LOCKED..    *
1bfe0 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c 61  /.    if( (wrfla
1bff0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
1c000 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1c010 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70  RITE).     || (p
1c020 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1c030 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
1c040 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f     ){.      pBlo
1c050 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
1c060 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65  r->db;.    }else
1c070 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
1c080 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  .      BtLock *p
1c090 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  Iter;.      for(
1c0a0 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
1c0b0 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
1c0c0 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
1c0d0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1c0e0 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
1c0f0 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
1c100 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
1c110 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  db;.          br
1c120 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1c130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c140 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
1c150 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
1c160 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
1c170 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
1c180 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c190 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1c1a0 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74  HE;.      goto t
1c1b0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20  rans_begun;.    
1c1c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1c1d0 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
1c1e0 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
1c1f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
1c200 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
1c210 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
1c220 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
1c230 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
1c240 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
1c250 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
1c260 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
1c270 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1c280 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
1c290 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
1c2a0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1c2b0 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
1c2c0 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
1c2d0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1c2e0 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
1c2f0 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
1c300 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1c310 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1c320 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
1c330 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
1c340 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
1c350 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1c360 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
1c370 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
1c380 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
1c390 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
1c3a0 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
1c3b0 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
1c3c0 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
1c3d0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
1c3e0 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
1c3f0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
1c400 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1c410 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1c420 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
1c430 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
1c440 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
1c450 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
1c460 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
1c470 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
1c480 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
1c490 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
1c4a0 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
1c4b0 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
1c4c0 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
1c4d0 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
1c4e0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
1c4f0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
1c500 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
1c510 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
1c520 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
1c530 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
1c540 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
1c550 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1c560 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
1c570 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1c580 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1c590 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1c5a0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1c5b0 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
1c5c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1c5d0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1c5e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
1c5f0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
1c600 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
1c610 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1c620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c630 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1c640 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1c650 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1c660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
1c670 53 59 5f 53 4e 41 50 53 48 4f 54 20 26 26 20 70  SY_SNAPSHOT && p
1c680 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c690 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  n==TRANS_NONE ){
1c6a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66  .          /* if
1c6b0 20 74 68 65 72 65 20 77 61 73 20 6e 6f 20 74 72   there was no tr
1c6c0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
1c6d0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1c6e0 69 6f 6e 20 77 61 73 0a 20 20 20 20 20 20 20 20  ion was.        
1c6f0 20 20 2a 2a 20 63 61 6c 6c 65 64 20 61 6e 64 20    ** called and 
1c700 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
1c710 53 48 4f 54 20 69 73 20 72 65 74 75 72 6e 65 64  SHOT is returned
1c720 2c 20 63 68 61 6e 67 65 20 74 68 65 20 65 72 72  , change the err
1c730 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1c740 63 6f 64 65 20 74 6f 20 53 51 4c 49 54 45 5f 42  code to SQLITE_B
1c750 55 53 59 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  USY. */.        
1c760 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1c770 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  SY;.        }.  
1c780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1c790 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c7a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
1c7b0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1c7c0 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
1c7d0 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
1c7e0 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
1c7f0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1c800 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1c810 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
1c820 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
1c830 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 20 20 73  dler(pBt) );.  s
1c840 71 6c 69 74 65 33 50 61 67 65 72 52 65 73 65 74  qlite3PagerReset
1c850 4c 6f 63 6b 54 69 6d 65 6f 75 74 28 70 42 74 2d  LockTimeout(pBt-
1c860 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  >pPager);..  if(
1c870 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c880 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
1c890 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1c8a0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
1c8b0 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
1c8c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c8d0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1c8e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
1c8f0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
1c900 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
1c910 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
1c920 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
1c930 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
1c940 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
1c950 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
1c960 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
1c970 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
1c980 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
1c990 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
1c9a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1c9b0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
1c9c0 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
1c9d0 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
1c9e0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1c9f0 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
1ca00 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
1ca10 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1ca20 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
1ca30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
1ca40 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
1ca50 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1ca60 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
1ca70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ca80 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1ca90 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
1caa0 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1cab0 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
1cac0 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
1cad0 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1cae0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1caf0 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
1cb00 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1cb10 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
1cb20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1cb30 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
1cb40 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
1cb50 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
1cb60 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
1cb70 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
1cb80 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
1cb90 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1cba0 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
1cbb0 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
1cbc0 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
1cbd0 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
1cbe0 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
1cbf0 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
1cc00 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
1cc10 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
1cc20 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
1cc30 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
1cc40 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
1cc50 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
1cc60 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
1cc70 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
1cc80 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1cc90 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
1cca0 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
1ccb0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1ccc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1ccd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1cce0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1ccf0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1cd00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cd10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1cd20 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1cd30 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1cd40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
1cd50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cd60 20 7d 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a   }..trans_begun:
1cd70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cd80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1cd90 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 20 29  pSchemaVersion )
1cda0 7b 0a 20 20 20 20 20 20 2a 70 53 63 68 65 6d 61  {.      *pSchema
1cdb0 56 65 72 73 69 6f 6e 20 3d 20 67 65 74 34 62 79  Version = get4by
1cdc0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1cdd0 3e 61 44 61 74 61 5b 34 30 5d 29 3b 0a 20 20 20  >aData[40]);.   
1cde0 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
1cdf0 67 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  g ){.      /* Th
1ce00 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
1ce10 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
1ce20 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
1ce30 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
1ce40 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
1ce50 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
1ce60 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
1ce70 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
1ce80 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
1ce90 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
1cea0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1ceb0 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
1cec0 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
1ced0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1cee0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1cef0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1cf00 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
1cf10 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
1cf20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65    }.  }..  btree
1cf30 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
1cf40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1cf50 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1cf60 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1cf70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1cf80 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
1cf90 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
1cfa0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1cfb0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
1cfc0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
1cfd0 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
1cfe0 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
1cff0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1d000 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
1d010 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
1d020 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
1d030 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
1d040 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
1d050 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
1d060 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
1d070 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
1d0a0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
1d0b0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d0e0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
1d0f0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
1d100 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d120 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1d130 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d140 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1d150 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
1d160 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
1d170 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d180 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1d190 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1d1a0 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  rc = pPage->isIn
1d1b0 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  it ? SQLITE_OK :
1d1c0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1d1d0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1d1e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1d1f0 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20  urn rc;.  nCell 
1d200 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1d210 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1d220 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
1d230 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1d240 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
1d250 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
1d260 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
1d270 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66  l, &rc);..    if
1d280 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1d290 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
1d2a0 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1d2b0 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
1d2c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1d2d0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1d2e0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1d2f0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
1d300 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1d310 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
1d320 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1d330 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1d340 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1d350 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  t+8]);.    ptrma
1d360 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1d370 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1d380 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1d390 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1d3a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
1d3b0 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
1d3c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
1d3d0 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
1d3e0 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
1d3f0 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
1d400 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
1d410 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
1d420 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
1d430 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
1d440 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
1d450 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
1d460 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
1d470 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1d480 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1d490 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
1d4a0 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1d4c0 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
1d4d0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1d4e0 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
1d4f0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1d500 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1d510 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
1d540 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
1d550 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
1d560 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1d570 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
1d580 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
1d590 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1d5a0 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
1d5b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d5c0 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
1d5d0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
1d5e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1d5f0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1d600 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
1d610 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
1d620 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
1d630 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1d640 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1d650 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1d660 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1d670 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1d680 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
1d690 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
1d6a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1d6b0 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
1d6c0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
1d6d0 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
1d6e0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
1d6f0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1d700 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
1d710 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1d720 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
1d730 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d740 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
1d750 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
1d760 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1d770 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
1d780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1d790 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
1d7a0 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ll;.    int rc;.
1d7b0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 2d  .    rc = pPage-
1d7c0 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45  >isInit ? SQLITE
1d7d0 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50  _OK : btreeInitP
1d7e0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
1d7f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1d800 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
1d810 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1d820 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1d830 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1d840 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1d850 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1d860 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1d870 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1d880 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
1d890 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1d8a0 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
1d8b0 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
1d8c0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1d8d0 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c       if( info.nL
1d8e0 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
1d8f0 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
1d900 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  if( pCell+info.n
1d910 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44  Size > pPage->aD
1d920 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ata+pPage->pBt->
1d930 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
1d940 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d950 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d960 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
1d970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d980 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65     if( iFrom==ge
1d990 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66  t4byte(pCell+inf
1d9a0 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20  o.nSize-4) ){.  
1d9b0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1d9c0 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  te(pCell+info.nS
1d9d0 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20  ize-4, iTo);.   
1d9e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1d9f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1da00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1da10 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
1da20 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
1da30 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1da40 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1da50 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
1da60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1da70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1da80 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
1da90 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
1daa0 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1dab0 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
1dac0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
1dad0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1dae0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1daf0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1db00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1db10 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
1db20 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1db30 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1db40 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1db50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
1db60 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iTo);.    }.  }.
1db70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1db80 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
1db90 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
1dba0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1dbb0 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
1dbc0 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
1dbd0 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
1dbe0 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
1dbf0 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
1dc00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
1dc10 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
1dc20 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
1dc30 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
1dc40 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
1dc50 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
1dc60 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
1dc70 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
1dc80 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
1dc90 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
1dca0 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
1dcb0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1dcc0 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
1dcd0 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
1dce0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1dcf0 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
1dd00 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1dd10 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
1dd20 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
1dd30 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
1dd40 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
1dd50 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
1dd60 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
1dd70 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1dd80 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
1dd90 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1dda0 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
1ddb0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
1ddc0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
1ddd0 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
1dde0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1ddf0 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
1de00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
1de10 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
1de20 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
1de30 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1de40 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
1de50 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
1de60 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
1de70 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
1de80 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
1de90 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
1dea0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
1deb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
1dec0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
1ded0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
1dee0 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
1def0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1df00 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
1df10 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1df20 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1df30 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
1df40 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
1df50 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
1df60 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1df70 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1df80 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
1df90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1dfa0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1dfb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1dfc0 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
1dfd0 20 29 3b 0a 20 20 69 66 28 20 69 44 62 50 61 67   );.  if( iDbPag
1dfe0 65 3c 33 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e<3 ) return SQL
1dff0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e000 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
1e010 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
1e020 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
1e030 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
1e040 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
1e050 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
1e060 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
1e070 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
1e080 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
1e090 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
1e0a0 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1e0b0 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
1e0c0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
1e0d0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1e0e0 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
1e0f0 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
1e100 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
1e110 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
1e120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1e130 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1e140 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
1e150 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
1e160 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
1e170 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
1e180 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
1e190 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
1e1a0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
1e1b0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1e1c0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
1e1d0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
1e1e0 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
1e1f0 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
1e200 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
1e210 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
1e220 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1e230 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
1e240 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1e250 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
1e260 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
1e270 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1e280 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
1e290 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1e2a0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
1e2b0 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
1e2c0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
1e2d0 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
1e2e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
1e2f0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1e300 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1e310 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1e320 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1e330 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
1e340 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
1e350 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e360 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1e370 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1e380 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1e390 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
1e3a0 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
1e3b0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
1e3c0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
1e3d0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1e3e0 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
1e3f0 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
1e400 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
1e410 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e430 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1e440 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1e450 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
1e460 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
1e470 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
1e480 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
1e490 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
1e4a0 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
1e4b0 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
1e4c0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
1e4d0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
1e4e0 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
1e4f0 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
1e500 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1e510 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1e520 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
1e530 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
1e540 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1e550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e560 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e570 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1e580 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e590 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
1e5a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1e5b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e5c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e5d0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
1e5e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1e5f0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
1e600 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
1e610 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
1e620 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
1e630 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1e640 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1e650 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
1e670 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
1e680 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
1e690 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
1e6a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e6b0 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
1e6c0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
1e6d0 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
1e6e0 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
1e6f0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1e700 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
1e710 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
1e720 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
1e730 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
1e740 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
1e750 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
1e760 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
1e770 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1e780 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
1e790 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
1e7a0 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
1e7b0 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
1e7c0 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
1e7d0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1e7e0 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
1e7f0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
1e800 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1e810 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1e820 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1e830 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
1e840 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
1e850 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
1e860 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
1e870 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
1e880 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
1e890 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
1e8a0 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
1e8b0 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
1e8c0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
1e8d0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
1e8e0 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
1e8f0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
1e900 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
1e910 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
1e920 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
1e930 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
1e940 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1e950 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
1e960 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
1e970 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
1e980 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
1e990 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
1e9a0 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
1e9b0 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
1e9c0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
1e9d0 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1e9e0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
1e9f0 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
1ea00 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
1ea10 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
1ea20 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
1ea30 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
1ea40 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
1ea50 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1ea60 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
1ea70 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
1ea80 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
1ea90 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
1eaa0 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
1eab0 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
1eac0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
1ead0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1eae0 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
1eaf0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
1eb00 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1eb10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1eb20 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1eb30 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1eb40 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
1eb50 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
1eb60 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1eb70 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
1eb80 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1eb90 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1eba0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
1ebb0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
1ebc0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
1ebd0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1ebe0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1ebf0 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
1ec00 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
1ec10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1ec20 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
1ec30 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1ec40 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
1ec50 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
1ec60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ec70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1ec80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ec90 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1eca0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1ecb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ecc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1ecd0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
1ece0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1ecf0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1ed00 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1ed10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
1ed20 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
1ed30 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
1ed40 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
1ed50 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
1ed60 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
1ed70 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
1ed80 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
1ed90 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
1eda0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
1edb0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1edc0 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
1edd0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
1ede0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
1edf0 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
1ee00 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
1ee10 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
1ee20 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
1ee30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1ee40 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
1ee50 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1ee60 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1ee70 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1ee80 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1ee90 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
1eea0 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
1eeb0 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
1eec0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1eed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1eee0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1eef0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1ef00 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
1ef10 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
1ef20 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1ef30 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1ef40 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1ef50 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
1ef60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1ef70 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
1ef80 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
1ef90 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
1efa0 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
1efb0 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
1efc0 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
1efd0 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
1efe0 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1eff0 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
1f000 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
1f010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
1f020 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
1f030 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1f040 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
1f050 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1f060 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
1f070 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
1f080 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f090 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f0a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f0b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1f0c0 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
1f0d0 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
1f0e0 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
1f0f0 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
1f100 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
1f110 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
1f120 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
1f130 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
1f140 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
1f150 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
1f160 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
1f170 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
1f180 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
1f190 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
1f1a0 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
1f1b0 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
1f1c0 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
1f1d0 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
1f1e0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1f1f0 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
1f200 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1f210 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1f220 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
1f230 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
1f240 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
1f250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
1f260 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
1f270 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1f280 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1f290 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1f2a0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1f2b0 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
1f2c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1f2d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f2e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1f2f0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1f300 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1f310 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1f320 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1f330 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1f340 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
1f350 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
1f360 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
1f370 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
1f380 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
1f390 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
1f3a0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
1f3b0 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
1f3c0 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
1f3d0 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
1f3e0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1f3f0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1f400 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f410 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f420 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1f430 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
1f440 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
1f450 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
1f460 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
1f470 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
1f480 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f490 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
1f4a0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
1f4b0 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
1f4c0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1f4d0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
1f4e0 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
1f4f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f500 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
1f510 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
1f520 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1f530 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
1f540 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
1f550 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
1f560 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
1f570 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
1f580 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
1f590 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
1f5a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1f5b0 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
1f5c0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
1f5d0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
1f5e0 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
1f5f0 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
1f600 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
1f610 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
1f620 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f640 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1f650 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
1f660 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
1f670 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
1f680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f690 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
1f6a0 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
1f6b0 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
1f6c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f6d0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f6e0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
1f6f0 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
1f700 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
1f710 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
1f720 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
1f730 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
1f740 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
1f750 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
1f760 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
1f770 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
1f780 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f790 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
1f7a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f7b0 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1f7c0 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
1f7d0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1f7e0 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
1f7f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1f800 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1f810 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
1f820 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
1f830 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1f840 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
1f850 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
1f860 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1f870 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
1f880 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
1f890 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
1f8a0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1f8b0 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
1f8c0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
1f8d0 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
1f8e0 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
1f8f0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
1f900 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
1f910 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
1f920 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
1f930 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
1f940 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
1f950 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1f960 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
1f970 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1f980 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
1f990 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
1f9a0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
1f9b0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1f9c0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1f9d0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1f9e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1f9f0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1fa00 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1fa10 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
1fa20 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1fa30 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
1fa40 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1fa50 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1fa60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
1fa70 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
1fa80 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1fa90 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
1faa0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1fab0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1fac0 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
1fad0 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1fae0 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1faf0 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
1fb00 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
1fb10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1fb20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1fb30 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
1fb40 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1fb50 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1fb60 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
1fb70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fb80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
1fb90 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1fba0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1fbb0 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
1fbc0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1fbd0 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
1fbe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1fbf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fc00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1fc10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1fc20 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1fc30 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1fc40 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1fc50 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1fc60 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1fc70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1fc80 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1fc90 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1fca0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
1fcb0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1fcc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fcd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1fce0 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
1fcf0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1fd00 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
1fd10 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1fd20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
1fd30 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1fd40 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
1fd50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1fd60 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
1fd70 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
1fd80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1fd90 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
1fda0 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1fdb0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
1fdc0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
1fdd0 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
1fde0 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
1fdf0 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
1fe00 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
1fe10 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
1fe20 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
1fe30 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
1fe40 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
1fe50 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
1fe60 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
1fe70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1fe80 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1fe90 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1fea0 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
1feb0 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
1fec0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1fed0 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20  ); )..  assert( 
1fee0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1fef0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1ff00 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
1ff10 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1ff20 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
1ff30 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
1ff40 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
1ff50 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1ff60 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1ff70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1ff80 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1ff90 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
1ffa0 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
1ffb0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
1ffc0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1ffd0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1ffe0 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
1fff0 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
20000 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
20010 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
20020 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
20030 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
20040 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
20050 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
20060 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
20070 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
20080 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
20090 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
200a0 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
200b0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
200c0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
200d0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
200e0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
200f0 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
20100 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
20110 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
20120 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
20130 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
20140 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
20150 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
20160 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
20170 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
20180 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
20190 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
201a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
201b0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
201c0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
201d0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
201e0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
201f0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
20200 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
20210 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
20220 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
20230 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20240 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
20250 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
20260 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
20270 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
20280 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
20290 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
202a0 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
202b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
202c0 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
202d0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
202e0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
202f0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
20300 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
20310 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
20320 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
20330 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
20340 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20350 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
20360 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20370 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
20380 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
20390 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
203a0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
203b0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
203c0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
203d0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
203e0 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
203f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
20400 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
20410 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
20420 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
20430 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20440 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
20450 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
20460 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
20470 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
20480 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
20490 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
204a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
204b0 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
204c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
204d0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
204e0 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
204f0 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
20500 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
20510 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
20520 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
20530 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
20540 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
20550 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
20560 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
20570 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
20580 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
20590 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
205a0 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
205b0 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
205c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
205d0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
205e0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
205f0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
20600 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
20610 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
20620 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
20630 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
20640 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
20650 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
20660 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
20670 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
20680 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
20690 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
206a0 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
206b0 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
206c0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
206d0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
206e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
206f0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
20700 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
20710 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
20720 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
20730 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
20740 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
20750 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
20760 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
20770 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
20780 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
20790 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
207a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
207b0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
207c0 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
207d0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
207e0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
207f0 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
20800 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
20810 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
20820 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
20830 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
20840 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
20850 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
20860 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
20870 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
20880 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
20890 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
208a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
208b0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
208c0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
208d0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
208e0 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
208f0 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
20900 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
20910 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
20920 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
20930 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
20940 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
20950 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
20960 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
20970 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
20980 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
20990 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
209a0 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
209b0 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
209c0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
209d0 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
209e0 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
209f0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
20a00 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
20a10 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
20a20 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
20a30 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
20a40 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
20a50 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
20a60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
20a70 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
20a80 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
20a90 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
20aa0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20ab0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
20ac0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
20ad0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
20ae0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
20af0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20b00 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
20b10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20b20 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
20b30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
20b40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
20b50 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
20b60 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
20b70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20b80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20b90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20ba0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
20bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20bc0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
20bd0 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
20be0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
20bf0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
20c00 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
20c10 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
20c20 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
20c30 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
20c40 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
20c50 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
20c60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
20c70 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
20c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20c90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20ca0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
20cb0 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
20cc0 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
20cd0 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
20ce0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
20cf0 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
20d00 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
20d10 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
20d20 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
20d30 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
20d40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
20d50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20d60 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
20d70 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
20d80 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
20d90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20da0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
20db0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
20dc0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
20dd0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
20de0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
20df0 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
20e00 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
20e10 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
20e20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
20e30 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
20e40 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
20e50 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
20e60 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
20e70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
20e80 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
20e90 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
20ea0 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
20eb0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
20ec0 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
20ed0 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
20ee0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
20ef0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
20f00 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
20f10 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
20f20 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
20f30 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
20f40 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
20f50 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
20f60 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
20f70 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
20f80 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
20f90 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
20fa0 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
20fb0 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
20fc0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
20fd0 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
20fe0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
20ff0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
21000 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
21010 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
21020 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
21030 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
21040 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
21050 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
21060 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
21070 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
21080 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
21090 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
210a0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
210b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
210c0 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
210d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
210e0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
210f0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
21100 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
21110 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
21120 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
21130 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
21140 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
21150 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
21160 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
21170 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
21180 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
21190 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
211a0 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
211b0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
211c0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
211d0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
211e0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
211f0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
21200 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
21210 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
21220 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
21230 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
21240 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
21250 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
21260 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
21270 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
21280 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
21290 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
212a0 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
212b0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
212c0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
212d0 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
212e0 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
212f0 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
21300 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
21310 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
21320 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
21330 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
21340 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
21350 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
21360 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
21370 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
21380 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
21390 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
213a0 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
213b0 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
213c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
213d0 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
213e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
213f0 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
21400 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
21410 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
21420 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
21430 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
21440 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
21450 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
21460 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
21470 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
21480 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
21490 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
214a0 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
214b0 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
214c0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
214d0 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
214e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
214f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
21500 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
21510 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
21520 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
21530 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
21540 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
21550 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21560 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
21570 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
21580 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
21590 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
215a0 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
215b0 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
215c0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
215d0 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
215e0 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
215f0 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
21600 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
21610 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
21620 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
21630 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
21640 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
21650 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
21660 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
21670 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
21680 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
21690 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
216a0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
216b0 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
216c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
216d0 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
216e0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
216f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21700 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
21710 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
21720 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
21730 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
21740 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
21750 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
21760 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
21770 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
21780 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
21790 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
217a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
217b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
217c0 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
217d0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
217e0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
217f0 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
21800 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
21810 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
21820 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
21830 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
21840 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
21850 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
21860 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
21870 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
21880 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
21890 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
218a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
218b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
218c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
218d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
218e0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
218f0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
21900 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
21910 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
21920 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
21930 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
21940 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
21950 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
21960 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
21970 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
21980 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
21990 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73      p->iDataVers
219a0 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65  ion--;  /* Compe
219b0 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72  nsate for pPager
219c0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b  ->iDataVersion++
219d0 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e  ; */.    pBt->in
219e0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
219f0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
21a00 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
21a10 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
21a20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
21a30 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
21a40 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
21a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21a60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
21a70 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
21a80 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
21a90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21aa0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
21ab0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
21ac0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
21ad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
21ae0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
21af0 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
21b00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21b10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21b20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
21b30 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
21b40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21b50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21b60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
21b70 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
21b80 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
21b90 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
21ba0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
21bb0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
21bc0 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e  ery cursor on an
21bd0 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  y BtShared that 
21be0 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
21bf0 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65  nces.  Or if the
21c00 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
21c10 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65  is set to 1, the
21c20 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77  n only.** trip w
21c30 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64  rite cursors and
21c40 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73   leave read curs
21c50 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ors unchanged..*
21c60 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
21c70 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  r is a candidate
21c80 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20   to be tripped, 
21c90 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
21ca0 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67  s.** that belong
21cb0 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
21cc0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
21cd0 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
21ce0 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20  .** sharing the 
21cf0 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
21d00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
21d10 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
21d20 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
21d30 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65  k occurs. If the
21d40 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c   writeOnly.** fl
21d50 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
21d60 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73   only write-curs
21d70 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70  ors need be trip
21d80 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a  ped - read-only.
21d90 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20  ** cursors save 
21da0 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f  their current po
21db0 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20  sitions so that 
21dc0 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75  they may continu
21dd0 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
21de0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72  the rollback. Or
21df0 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  , if writeOnly i
21e00 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72  s false, all cur
21e10 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69  sors are .** tri
21e20 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c  pped. In general
21e30 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  , writeOnly is f
21e40 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e  alse if the tran
21e50 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a  saction being.**
21e60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64   rolled back mod
21e70 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
21e80 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68  se schema. In th
21e90 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72  is case b-tree r
21ea0 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79  oot.** pages may
21eb0 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c   be moved or del
21ec0 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
21ed0 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65  tabase altogethe
21ee0 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20  r, making.** it 
21ef0 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20  unsafe for read 
21f00 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69  cursors to conti
21f10 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nue..**.** If th
21f20 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
21f30 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20   is true and an 
21f40 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
21f50 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73  ered while .** s
21f60 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aving the curren
21f70 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20  t position of a 
21f80 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
21f90 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a  , all cursors, .
21fa0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  ** including all
21fb0 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72   read-cursors ar
21fc0 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a  e tripped..**.**
21fd0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
21fe0 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
21ff0 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  sful, or if an e
22000 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
22010 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75  e.** saving a cu
22020 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61  rsor position, a
22030 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
22040 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
22050 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
22060 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
22070 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
22080 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79  e, int writeOnly
22090 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
220a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
220b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
220c0 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  t( (writeOnly==0
220d0 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31   || writeOnly==1
220e0 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46  ) && BTCF_WriteF
220f0 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  lag==1 );.  if( 
22100 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71  pBtree ){.    sq
22110 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22120 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72  pBtree);.    for
22130 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
22140 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
22150 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
22160 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20  f( writeOnly && 
22170 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  (p->curFlags & B
22180 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
22190 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
221a0 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
221b0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65  OR_VALID || p->e
221c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
221d0 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20  IPNEXT ){.      
221e0 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72      rc = saveCur
221f0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
22200 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
22210 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22220 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
22230 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69  )sqlite3BtreeTri
22240 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72  pAllCursors(pBtr
22250 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20  ee, rc, 0);.    
22260 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22270 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22280 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
22290 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
222a0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
222b0 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  r(p);.        p-
222c0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
222d0 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20  _FAULT;.        
222e0 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72  p->skipNext = er
222f0 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20  rCode;.      }. 
22300 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73       btreeReleas
22310 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
22320 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
22330 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
22340 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
22350 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22360 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
22370 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
22380 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  rogress..**.** I
22390 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
223a0 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e  t SQLITE_OK then
223b0 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
223c0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72   invalidated (tr
223d0 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20  ipped)..** Only 
223e0 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
223f0 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  e tripped if wri
22400 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62  teOnly is true b
22410 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  ut all cursors a
22420 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66  re.** tripped if
22430 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
22440 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  lse.  Any attemp
22450 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72  t to use.** a tr
22460 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c  ipped cursor wil
22470 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  l result in an e
22480 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
22490 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
224a0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
224b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
224c0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
224d0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
224e0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
224f0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
22500 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
22510 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
22520 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ck(Btree *p, int
22530 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77   tripCode, int w
22540 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  riteOnly){.  int
22550 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
22560 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
22570 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
22580 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69  ;..  assert( wri
22590 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69  teOnly==1 || wri
225a0 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  teOnly==0 );.  a
225b0 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d  ssert( tripCode=
225c0 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f  =SQLITE_ABORT_RO
225d0 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f  LLBACK || tripCo
225e0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
225f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
22600 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74  nter(p);.  if( t
22610 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
22620 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74  OK ){.    rc = t
22630 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c  ripCode = saveAl
22640 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
22650 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
22660 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b  ) writeOnly = 0;
22670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
22680 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22690 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
226a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
226b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  = sqlite3BtreeTr
226c0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
226d0 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f  tripCode, writeO
226e0 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nly);.    assert
226f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22700 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  || (writeOnly==0
22710 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   && rc2==SQLITE_
22720 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  OK) );.    if( r
22730 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  c2!=SQLITE_OK ) 
22740 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20  rc = rc2;.  }.  
22750 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
22760 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
22770 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
22780 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
22790 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
227a0 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
227b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
227c0 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
227d0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
227e0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
227f0 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
22800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
22810 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
22820 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
22830 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
22840 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
22850 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
22860 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
22870 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
22880 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
22890 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
228a0 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
228b0 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
228c0 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
228d0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
228e0 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
228f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22900 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
22910 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
22920 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
22930 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22940 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
22950 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
22960 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
22970 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
22980 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
22990 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
229a0 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
229b0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
229c0 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
229d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
229e0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
229f0 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
22a00 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
22a10 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
22a20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
22a30 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
22a40 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
22a50 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
22a60 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
22a70 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
22a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22a90 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
22aa0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
22ab0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
22ac0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
22ad0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
22ae0 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
22af0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
22b00 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
22b10 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
22b20 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
22b30 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
22b40 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
22b50 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
22b60 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
22b70 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
22b80 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
22b90 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
22ba0 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
22bb0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
22bc0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
22bd0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
22be0 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
22bf0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
22c00 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
22c10 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
22c20 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
22c30 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
22c40 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
22c50 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
22c60 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
22c70 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
22c80 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
22c90 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
22ca0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
22cb0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
22cc0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
22cd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
22ce0 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
22cf0 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
22d00 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
22d10 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
22d20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
22d30 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
22d40 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
22d50 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
22d60 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
22d70 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
22d80 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
22d90 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
22da0 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
22db0 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
22dc0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
22dd0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
22de0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
22df0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
22e00 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
22e10 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
22e20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
22e30 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
22e40 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
22e50 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
22e60 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
22e70 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
22e80 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
22e90 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
22ea0 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
22eb0 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
22ec0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
22ed0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
22ee0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
22ef0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
22f00 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
22f10 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
22f20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
22f30 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
22f40 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
22f50 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
22f60 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
22f70 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
22f80 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
22f90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
22fa0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
22fb0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
22fc0 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
22fd0 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
22fe0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
22ff0 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
23000 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
23010 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
23020 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
23030 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
23040 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
23050 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
23060 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
23070 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
23080 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
23090 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
230a0 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
230b0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
230c0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
230d0 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
230e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
230f0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
23100 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
23110 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
23120 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
23130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23140 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
23150 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
23160 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
23170 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
23180 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
23190 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
231a0 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
231b0 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
231c0 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
231d0 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
231e0 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
231f0 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
23200 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
23210 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
23220 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
23230 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
23240 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
23250 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
23260 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
23270 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
23280 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
23290 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
232a0 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
232b0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
232c0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
232d0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
232e0 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
232f0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
23300 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
23310 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
23320 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
23330 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
23340 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
23350 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
23360 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
23370 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23380 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
23390 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
233a0 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
233b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
233c0 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
233d0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
233e0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
233f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
23400 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
23410 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
23420 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
23430 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
23440 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
23450 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
23460 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
23470 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
23480 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
23490 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
234a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66  Enter(p);.    if
234b0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
234c0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
234d0 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
234e0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
234f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23500 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23510 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23520 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
23530 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
23540 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
23550 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23570 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
23580 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
23590 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
235a0 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
235b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
235c0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
235d0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
235e0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
235f0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
23600 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
23610 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
23620 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
23630 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
23640 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
23650 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
23660 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
23670 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
23680 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
23690 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
236a0 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
236b0 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
236c0 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
236d0 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
236e0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
236f0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
23700 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
23710 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
23720 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
23730 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
23740 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
23750 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
23760 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
23770 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
23780 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
23790 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
237a0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
237b0 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
237c0 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
237d0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
237e0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
237f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23800 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
23810 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
23820 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
23830 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
23840 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
23850 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
23860 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
23870 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
23880 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  SR bit of wrFlag
23890 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
238a0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
238b0 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66  nly.** be used f
238c0 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20  or reading.  If 
238d0 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
238e0 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e  bit is set, then
238f0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
23900 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
23910 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72  eading or for wr
23920 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
23930 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
23940 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73  iting.** are als
23950 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72  o met.  These ar
23960 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
23970 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
23980 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f  t in order.** fo
23990 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20  r writing to be 
239a0 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
239b0 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
239c0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
239d0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20  ned with wrFlag 
239e0 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45  containing BTREE
239f0 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20  _WRCSR.**.** 2: 
23a00 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
23a10 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
23a20 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
23a30 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
23a40 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
23a50 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
23a60 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
23a70 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
23a80 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
23a90 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
23aa0 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
23ab0 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
23ac0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
23ad0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
23ae0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
23af0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
23b00 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
23b10 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
23b20 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
23b30 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
23b40 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
23b50 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
23b60 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
23b70 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
23b80 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
23b90 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
23ba0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
23bb0 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44  * The BTREE_FORD
23bc0 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46  ELETE bit of wrF
23bd0 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c  lag may optional
23be0 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52  ly be set if BTR
23bf0 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73  EE_WRCSR.** is s
23c00 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54  et.  If FORDELET
23c10 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69  E is set, that i
23c20 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
23c30 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
23c40 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73  hat.** this curs
23c50 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  or will only be 
23c60 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20  used to seek to 
23c70 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69  and delete entri
23c80 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  es of an index.*
23c90 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c  * as part of a l
23ca0 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61  arger DELETE sta
23cb0 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52  tement.  The FOR
23cc0 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e  DELETE hint is n
23cd0 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ot used by.** th
23ce0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
23cf0 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70  n.  But in a hyp
23d00 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e  othetical altern
23d10 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e  ative storage en
23d20 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63  gine .** in whic
23d30 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  h index entries 
23d40 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
23d50 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63  y deleted when c
23d60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
23d70 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64  le.** rows are d
23d80 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44  eleted, the FORD
23d90 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20  ELETE flag is a 
23da0 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45  hint that all SE
23db0 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a  EK and DELETE.**
23dc0 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
23dd0 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62  his cursor can b
23de0 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c  e no-ops and all
23df0 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73   READ operations
23e00 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20   can .** return 
23e10 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79  a null row (2-by
23e20 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e  tes: 0x01 0x00).
23e30 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
23e40 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
23e50 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
23e60 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
23e70 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
23e80 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
23e90 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
23ea0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
23eb0 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
23ec0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
23ed0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
23ee0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
23ef0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
23f00 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
23f10 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
23f20 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
23f30 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
23f40 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
23f50 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
23f60 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
23f70 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
23f80 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23fb0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
23fc0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fe0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
23ff0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
24000 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
24010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
24030 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
24040 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
24050 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
24060 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
24070 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
24080 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
24090 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
240a0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
240b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240c0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
240d0 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
240e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
240f0 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
24100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
24110 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
24120 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
24130 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24150 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
24160 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
24170 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
24180 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
24190 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
241a0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
241b0 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
241c0 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
241d0 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
241e0 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
241f0 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
24200 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
24210 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
24220 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
24230 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
24240 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
24250 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
24260 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
24270 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
24280 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
24290 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
242a0 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
242b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
242c0 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
242d0 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
242e0 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
242f0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
24300 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
24310 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
24320 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
24330 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
24340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
24350 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
24360 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
24370 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
24380 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
24390 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
243a0 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
243b0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
243c0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
243d0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
243e0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
243f0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
24400 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
24410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
24420 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
24430 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
24440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
24450 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
24460 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
24470 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
24480 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
24490 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
244a0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
244b0 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
244c0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
244d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
244e0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  T;.  }.  if( iTa
244f0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
24500 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
24510 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24520 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
24530 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
24540 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
24550 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
24560 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
24570 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
24580 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
24590 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
245a0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
245b0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
245c0 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
245d0 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
245e0 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
245f0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
24600 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
24610 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
24620 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
24630 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
24640 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
24650 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54  gs = wrFlag ? BT
24660 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30  CF_WriteFlag : 0
24670 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
24680 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
24690 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
246a0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
246b0 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
246c0 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
246d0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
246e0 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
246f0 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
24700 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
24710 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
24720 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
24730 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
24740 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
24750 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
24760 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
24770 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
24780 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
24790 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
247a0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
247b0 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
247c0 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
247d0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
247e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
247f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
24800 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
24810 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
24820 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
24830 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
24840 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
24850 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
24860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24880 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
24890 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248c0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
248d0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
248e0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
248f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24910 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
24920 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
24930 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
24940 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
24950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
24960 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
24970 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
24980 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249a0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
249b0 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
249c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
249d0 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
249e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
249f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
24a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
24a10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
24a20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
24a30 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
24a40 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
24a50 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
24a60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
24a70 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
24a80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24a90 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
24aa0 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
24ab0 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
24ac0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
24ad0 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
24ae0 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
24af0 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
24b00 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
24b10 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
24b20 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
24b30 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
24b40 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
24b50 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
24b60 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
24b70 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
24b80 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
24b90 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
24ba0 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
24bb0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
24bc0 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
24bd0 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
24be0 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
24bf0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
24c00 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
24c10 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
24c20 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
24c30 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
24c40 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
24c50 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
24c60 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
24c70 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
24c80 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
24c90 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
24ca0 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
24cb0 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
24cc0 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
24cd0 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
24ce0 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
24cf0 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
24d00 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
24d10 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
24d20 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
24d30 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
24d40 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
24d50 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
24d60 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
24d70 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
24d80 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
24d90 75 72 73 6f 72 2c 20 42 54 43 55 52 53 4f 52 5f  ursor, BTCURSOR_
24da0 46 49 52 53 54 5f 55 4e 49 4e 49 54 29 29 3b 0a  FIRST_UNINIT));.
24db0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
24dc0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
24dd0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
24de0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
24df0 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
24e00 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
24e10 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
24e20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
24e30 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
24e40 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
24e50 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
24e60 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
24e70 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
24e80 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
24e90 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
24ea0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
24eb0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73  (pBtree);.    as
24ec0 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73  sert( pBt->pCurs
24ed0 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  or!=0 );.    if(
24ee0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70   pBt->pCursor==p
24ef0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74  Cur ){.      pBt
24f00 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
24f10 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
24f20 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73  se{.      BtCurs
24f30 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d  or *pPrev = pBt-
24f40 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >pCursor;.      
24f50 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
24f60 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43  pPrev->pNext==pC
24f70 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
24f80 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
24f90 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
24fa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
24fc0 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e  Prev = pPrev->pN
24fd0 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ext;.      }whil
24fe0 65 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29  e( ALWAYS(pPrev)
24ff0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74   );.    }.    bt
25000 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
25010 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
25020 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
25030 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
25040 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
25050 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
25060 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25070 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
25080 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
25090 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
250a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
250b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
250c0 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
250d0 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
250e0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
250f0 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
25100 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
25110 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
25120 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
25130 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
25140 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
25150 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
25160 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
25170 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
25180 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
25190 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
251a0 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
251b0 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
251c0 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
251d0 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
251e0 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ll()..*/.#ifndef
251f0 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
25200 20 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75   int cellInfoEqu
25210 61 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20  al(CellInfo *a, 
25220 43 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20  CellInfo *b){.  
25230 20 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62    if( a->nKey!=b
25240 2d 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e 20  ->nKey ) return 
25250 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70 50  0;.    if( a->pP
25260 61 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c  ayload!=b->pPayl
25270 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  oad ) return 0;.
25280 20 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c      if( a->nPayl
25290 6f 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64  oad!=b->nPayload
252a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
252b0 20 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d   if( a->nLocal!=
252c0 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75  b->nLocal ) retu
252d0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
252e0 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65  >nSize!=b->nSize
252f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25300 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
25310 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
25320 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
25330 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
25340 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
25350 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
25360 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
25370 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
25380 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
25390 67 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69  ge, pCur->ix, &i
253a0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
253b0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
253c0 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69  cellInfoEqual(&i
253d0 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
253e0 29 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ) );.  }.#else. 
253f0 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
25400 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
25410 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  f.static SQLITE_
25420 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65  NOINLINE void ge
25430 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
25440 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28  or *pCur){.  if(
25450 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
25460 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  e==0 ){.    pCur
25470 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
25480 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
25490 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
254a0 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43 75  (pCur->pPage,pCu
254b0 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66  r->ix,&pCur->inf
254c0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
254d0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
254e0 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  pCur);.  }.}..#i
254f0 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a  fndef NDEBUG  /*
25500 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e   The next routin
25510 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  e used only with
25520 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
25530 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20  ements */./*.** 
25540 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
25550 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f  he given BtCurso
25560 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76  r is valid.  A v
25570 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f  alid cursor is o
25580 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75  ne.** that is cu
25590 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
255a0 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28   to a row in a (
255b0 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65  non-empty) table
255c0 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  ..** This is a v
255d0 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74  erification rout
255e0 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
255f0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
25600 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
25610 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25620 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74  CursorIsValid(Bt
25630 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25640 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20   return pCur && 
25650 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25660 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65  RSOR_VALID;.}.#e
25670 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
25680 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25690 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e  eeCursorIsValidN
256a0 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  N(BtCursor *pCur
256b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ){.  assert( pCu
256c0 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
256d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
256e0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a  URSOR_VALID;.}..
256f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25700 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
25710 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f  teger key or "ro
25720 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65  wid" for a table
25730 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20   btree..** This 
25740 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
25750 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73  valid for a curs
25760 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74  or that is point
25770 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72  ing into a.** or
25780 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72  dinary table btr
25790 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ee.  If the curs
257a0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  or points to an 
257b0 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a  index btree or.*
257c0 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68  * is invalid, th
257d0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73  e result of this
257e0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65   routine is unde
257f0 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71  fined..*/.i64 sq
25800 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
25810 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  rKey(BtCursor *p
25820 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
25830 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25840 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
25850 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
25860 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
25870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25880 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
25890 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
258a0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r);.  return pCu
258b0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a  r->info.nKey;.}.
258c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
258d0 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
258e0 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75  _FUNC./*.** Retu
258f0 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  rn the offset in
25900 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
25910 66 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74 61  file for the sta
25920 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79  rt of the.** pay
25930 6c 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74 68  load to which th
25940 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
25950 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  ting..*/.i64 sql
25960 69 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28  ite3BtreeOffset(
25970 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
25980 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25990 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
259a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
259b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
259c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
259d0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
259e0 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29  ;.  return (i64)
259f0 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53  pCur->pBt->pageS
25a00 69 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d 3e  ize*((i64)pCur->
25a10 70 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29  pPage->pgno - 1)
25a20 20 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36 34   +.         (i64
25a30 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  )(pCur->info.pPa
25a40 79 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70 50  yload - pCur->pP
25a50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23  age->aData);.}.#
25a60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
25a70 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
25a80 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  L_FUNC */../*.**
25a90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
25aa0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70  er of bytes of p
25ab0 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65  ayload for the e
25ac0 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69  ntry that pCur i
25ad0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70  s.** currently p
25ae0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72  ointing to.  For
25af0 20 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74   table btrees, t
25b00 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
25b10 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74  amount.** of dat
25b20 61 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74  a.  For index bt
25b30 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
25b40 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  be the size of t
25b50 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
25b60 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
25b70 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
25b80 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
25b90 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
25ba0 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
25bb0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
25bc0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
25bd0 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
25be0 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
25bf0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
25c00 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
25c10 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75  RSOR_VALID..*/.u
25c20 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  32 sqlite3BtreeP
25c30 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72  ayloadSize(BtCur
25c40 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
25c50 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25c60 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25c70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25c80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25c90 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
25ca0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
25cb0 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
25cc0 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a  .nPayload;.}../*
25cd0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
25ce0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
25cf0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
25d00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
25d10 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
25d20 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
25d30 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
25d40 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
25d50 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
25d60 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
25d70 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
25d80 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
25d90 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
25da0 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
25db0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
25dc0 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
25dd0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
25de0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
25df0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
25e00 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
25e10 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
25e20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
25e30 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
25e40 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
25e50 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
25e60 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
25e70 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
25e80 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
25e90 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
25ea0 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
25eb0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
25ec0 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
25ed0 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
25ee0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
25ef0 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
25f00 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
25f10 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
25f20 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
25f30 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
25f40 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
25f50 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
25f60 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
25f70 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
25f80 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
25f90 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
25fa0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
25fb0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
25fc0 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
25fd0 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
25fe0 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
25ff0 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
26000 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
26010 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
26020 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
26030 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
26040 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
26050 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
26060 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
26070 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
26080 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
26090 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
260a0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
260b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
260c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
260d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
26100 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
26110 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
26120 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
26130 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
26140 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
26150 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
26160 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
26170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26180 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
26190 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
261a0 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
261b0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
261c0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
261d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
261e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
261f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
26200 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
26210 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
26220 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
26230 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26240 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
26250 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
26260 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
26270 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
26280 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
26290 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
262a0 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
262b0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
262c0 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
262d0 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
262e0 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
262f0 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
26300 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
26310 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
26320 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
26330 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
26340 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
26350 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
26360 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
26370 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
26380 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
26390 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
263a0 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
263b0 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
263c0 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
263d0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
263e0 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
263f0 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
26400 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
26410 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
26420 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
26430 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
26440 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
26450 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
26460 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
26470 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
26480 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
26490 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
264a0 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
264b0 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
264c0 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
264d0 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
264e0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
264f0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
26500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
26510 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
26520 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
26530 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
26540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26550 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
26560 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
26570 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
26580 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
26590 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
265a0 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
265b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
265c0 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
265d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
265e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
265f0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
26600 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
26610 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
26620 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
26630 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
26640 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
26650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
26660 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
26670 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26680 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
26690 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
266a0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
266b0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
266c0 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
266d0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
266e0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
266f0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
26700 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
26710 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
26720 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
26730 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
26740 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
26750 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
26760 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
26770 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
26780 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
26790 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
267a0 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
267b0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
267c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
267d0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
267e0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
267f0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
26800 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
26810 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
26820 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
26830 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
26840 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
26850 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
26860 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
26870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
26880 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
26890 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
268a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
268b0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
268c0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
268d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
268e0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
268f0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
26900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26910 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
26920 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
26930 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
26940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
26950 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
26960 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
26970 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
26980 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
26990 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
269a0 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
269b0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
269c0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
269d0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
269e0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
269f0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
26a00 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
26a10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
26a20 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
26a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26a40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
26a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
26a60 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
26a70 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
26a80 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
26a90 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
26aa0 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
26ab0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
26ac0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
26ad0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
26ae0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
26af0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26b00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26b10 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
26b20 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
26b30 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
26b40 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
26b50 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
26b60 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
26b70 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
26b80 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
26b90 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
26ba0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
26bb0 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
26bc0 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
26bd0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
26be0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
26bf0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
26c00 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
26c10 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
26c20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
26c30 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
26c40 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
26c50 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
26c60 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
26c70 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
26c80 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
26c90 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
26ca0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
26cb0 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
26cc0 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
26cd0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
26ce0 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
26cf0 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
26d00 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
26d10 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
26d20 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
26d30 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
26d40 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
26d50 70 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75  pages.** this fu
26d60 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63  nction may alloc
26d70 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ate space for an
26d80 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  d lazily populat
26d90 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f  e.** the overflo
26da0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
26db0 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
26dc0 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
26dd0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
26de0 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
26df0 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
26e00 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
26e10 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
26e20 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
26e30 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
26e40 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
26e50 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
26e60 6f 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20  ocated, it must 
26e70 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
26e80 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
26e90 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
26ea0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
26eb0 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
26ec0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
26ed0 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
26ee0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
26ef0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
26f00 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
26f10 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
26f20 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
26f30 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
26f40 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
26f50 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
26f60 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
26f70 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
26f80 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
26f90 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
26fa0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
26fb0 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
26fc0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
26fd0 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
26fe0 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
26ff0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
27000 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
27010 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
27020 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
27030 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
27040 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
27050 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
27060 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
27070 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
27080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27090 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
270a0 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
270b0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
270c0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
270d0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
270e0 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
270f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27100 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
27110 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
27120 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
27130 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
27140 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
27150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
27160 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
27170 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
27180 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->pPage;        
27190 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
271a0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
271b0 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
271c0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
271d0 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
271e0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
271f0 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
27200 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
27210 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
27220 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75  VERFLOW_READ.  u
27230 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
27240 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d  onst pBufStart =
27250 20 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74   pBuf;     /* St
27260 61 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  art of original 
27270 6f 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65  out buffer */.#e
27280 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
27290 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
272a0 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70  t( eOp==0 || eOp
272b0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
272c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
272d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
272e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
272f0 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
27300 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
27310 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27320 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
27330 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
27340 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
27350 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.pPayload;.  
27360 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61  assert( offset+a
27370 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  mt <= pCur->info
27380 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20  .nPayload );..  
27390 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64  assert( aPayload
273a0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   > pPage->aData 
273b0 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28  );.  if( (uptr)(
273c0 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65  aPayload - pPage
273d0 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d  ->aData) > (pBt-
273e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43  >usableSize - pC
273f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29  ur->info.nLocal)
27400 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
27410 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
27420 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
27430 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
27440 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20  n error.  The.  
27450 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c    ** conditional
27460 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79   above is really
27470 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61  :.    **    &aPa
27480 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
27490 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
274a0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
274b0 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a  ableSize].    **
274c0 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69   but is recast i
274d0 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20  nto its current 
274e0 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e  form to avoid in
274f0 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70  teger overflow p
27500 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20  roblems.    */. 
27510 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27520 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
27530 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
27540 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
27550 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
27560 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
27570 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
27580 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
27590 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
275a0 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
275b0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
275c0 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
275d0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
275e0 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
275f0 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
27600 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
27610 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
27620 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
27630 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
27640 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
27650 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
27660 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
27670 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
27680 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
27690 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
276a0 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20  nLocal;.  }...  
276b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
276c0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
276d0 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
276e0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
276f0 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
27700 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
27710 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
27720 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
27730 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
27740 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
27750 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
27760 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f  nLocal]);..    /
27770 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
27780 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61  r.aOverflow[] ha
27790 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
277a0 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
277b0 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  t now..    **.  
277c0 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c    ** The aOverfl
277d0 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69  ow[] array is si
277e0 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79  zed at one entry
277f0 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
27800 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  ow page.    ** i
27810 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
27820 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e  hain. The page n
27830 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
27840 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
27850 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65   is.    ** store
27860 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
27870 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ], etc. A value 
27880 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
27890 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20  rflow[] array.  
278a0 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20    ** means "not 
278b0 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20  yet known" (the 
278c0 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
278d0 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
278e0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72  */.    if( (pCur
278f0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
27900 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
27910 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
27920 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
27930 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
27940 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
27950 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
27960 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
27970 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a 20  ->aOverflow==0. 
27980 20 20 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28        || nOvfl*(
27990 69 6e 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f 29  int)sizeof(Pgno)
279a0 20 3e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   > sqlite3Malloc
279b0 53 69 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  Size(pCur->aOver
279c0 66 6c 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a 20  flow).      ){. 
279d0 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65         Pgno *aNe
279e0 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74  w = (Pgno*)sqlit
279f0 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
27a00 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
27a10 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
27a20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
27a30 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
27a40 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
27a50 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27a60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
27a70 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
27a80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
27a90 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e  ->aOverflow = aN
27aa0 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ew;.        }.  
27ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
27ac0 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
27ad0 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
27ae0 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
27af0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
27b00 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76   |= BTCF_ValidOv
27b10 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  fl;.    }else{. 
27b20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
27b30 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
27b40 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
27b50 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
27b60 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72  he.      ** entr
27b70 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
27b80 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
27b90 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
27ba0 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64   skip.      ** d
27bb0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
27bc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
27bd0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
27be0 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
27bf0 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49  e] ){.        iI
27c00 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66  dx = (offset/ovf
27c10 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  lSize);.        
27c20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
27c30 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
27c40 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
27c50 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
27c60 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
27c70 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
27c80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
27c90 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77  & amt>0 );.    w
27ca0 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29  hile( nextPage )
27cb0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  {.      /* If re
27cc0 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
27cd0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
27ce0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
27cf0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
27d00 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
27d10 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20  iIdx]==0.       
27d20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e         || pCur->
27d30 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
27d40 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20 20  =nextPage.      
27d50 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55          || CORRU
27d60 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70  PT_DB );.      p
27d70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
27d80 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
27d90 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
27da0 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
27db0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
27dc0 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
27dd0 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
27de0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
27df0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
27e00 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
27e10 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
27e20 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
27e30 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
27e40 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
27e50 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
27e60 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
27e70 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
27e80 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
27e90 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
27ea0 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
27eb0 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
27ec0 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
27ed0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
27ee0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27ef0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
27f00 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
27f10 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20  lidOvfl );.     
27f20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27f30 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74  >pBtree->db==pBt
27f40 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20  ->db );.        
27f50 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
27f60 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
27f70 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
27f80 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
27f90 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
27fa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27fb0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
27fc0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
27fd0 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
27fe0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
27ff0 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65   }.        offse
28000 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
28010 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28020 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
28030 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
28040 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
28050 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
28060 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
28070 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
28080 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
28090 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
280a0 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
280b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
280c0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
280d0 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
280e0 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
280f0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
28100 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
28110 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
28120 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
28130 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
28140 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
28150 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
28160 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
28170 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
28180 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
28190 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
281a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
281b0 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
281c0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
281d0 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
281e0 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
281f0 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
28200 72 65 20 61 72 65 20 6e 6f 20 64 69 72 74 79 20  re are no dirty 
28210 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
28220 65 2d 63 61 63 68 65 0a 20 20 20 20 20 20 20 20  e-cache.        
28230 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74 61  **   4) the data
28240 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
28250 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
28260 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61 67   **   5) the pag
28270 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
28280 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  WAL file.       
28290 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73   **   6) at leas
282a0 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
282b0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
282c0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
282d0 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
282e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
282f0 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
28300 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
28310 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
28320 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
28330 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
28340 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
28350 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
28360 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
28370 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
28380 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
28390 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
283a0 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
283b0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
283c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
283d0 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20  f( eOp==0       
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28400 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
28410 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
28420 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28450 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
28460 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
28470 72 44 69 72 65 63 74 52 65 61 64 4f 6b 28 70 42  rDirectReadOk(pB
28480 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
28490 61 67 65 29 20 20 20 20 2f 2a 20 28 33 2c 34 2c  age)    /* (3,4,
284a0 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  5) */.         &
284b0 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75  & &pBuf[-4]>=pBu
284c0 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20  fStart          
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20       /* (6) */. 
284f0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
28500 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
28510 20 2a 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   *fd = sqlite3Pa
28520 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
28530 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
28540 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
28550 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
28560 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
28570 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
28580 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
28590 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
285b0 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a 20   due to (6) */. 
285c0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
285d0 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34  aSave, aWrite, 4
285e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
285f0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
28600 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c  fd, aWrite, a+4,
28610 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53   (i64)pBt->pageS
28620 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29  ize*(nextPage-1)
28630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
28640 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
28650 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  (aWrite);.      
28660 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74      memcpy(aWrit
28670 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20  e, aSave, 4);.  
28680 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
28690 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  if..        {.  
286a0 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
286b0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
286c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
286d0 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
286e0 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
286f0 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
28700 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f         (eOp==0 ?
28710 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
28720 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20  NLY : 0).       
28730 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
28740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28750 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
28760 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
28770 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
28780 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
28790 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
287a0 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
287b0 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
287c0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
287d0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
287e0 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
287f0 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
28800 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28810 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
28820 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
28830 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
28840 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74     }.        amt
28860 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 69   -= a;.        i
28870 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65 74 75  f( amt==0 ) retu
28880 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70  rn rc;.        p
28890 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
288a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
288b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 49   break;.      iI
288c0 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dx++;.    }.  }.
288d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
288e0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
288f0 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  .    /* Overflow
28900 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72 65 6d   chain ends prem
28910 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20 20 72  aturely */.    r
28920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28930 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
28940 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28950 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
28960 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 79   part of the pay
28970 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77  load for the row
28980 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20 63   at which that c
28990 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63 75  ursor pCur is cu
289a0 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
289b0 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65  ing.  "amt" byte
289c0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
289d0 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
289e0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
289f0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
28a00 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43  ffset"..**.** pC
28a10 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69  ur can be pointi
28a20 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20 74  ng to either a t
28a30 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78  able or an index
28a40 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70   b-tree..** If p
28a50 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62  ointing to a tab
28a60 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74  le btree, then t
28a70 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69  he content secti
28a80 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a  on is read.  If.
28a90 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
28aa0 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ing to an index 
28ab0 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65 20  b-tree then the 
28ac0 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72  key section is r
28ad0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73  ead..**.** For s
28ae0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
28af0 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72  ad(), the caller
28b00 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
28b10 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
28b20 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
28b30 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c   row in the tabl
28b40 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42  e.  For sqlite3B
28b50 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
28b60 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72  ed(), the.** cur
28b70 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76  sor might be inv
28b80 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65  alid or might ne
28b90 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ed to be restore
28ba0 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
28bb0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ead..**.** Retur
28bc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
28bd0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
28be0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
28bf0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
28c00 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
28c10 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
28c20 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
28c30 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
28c40 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
28c50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28c60 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43  BtreePayload(BtC
28c70 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
28c80 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
28c90 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
28ca0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
28cb0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
28cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28cd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28ce0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
28cf0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
28d00 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  >=0 && pCur->pPa
28d10 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
28d20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
28d30 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
28d40 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
28d50 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
28d60 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
28d70 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
28d80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
28d90 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69   variant of sqli
28da0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
28db0 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20  ) works even if 
28dc0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
28dd0 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52  ot.** in the CUR
28de0 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e  SOR_VALID state.
28df0 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65    It is only use
28e00 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
28e10 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20  _blob_read().** 
28e20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
28e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28e40 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69  T_INCRBLOB.stati
28e50 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
28e60 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  E int accessPayl
28e70 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74  oadChecked(.  Bt
28e80 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20  Cursor *pCur,.  
28e90 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33  u32 offset,.  u3
28ea0 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70  2 amt,.  void *p
28eb0 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Buf.){.  int rc;
28ec0 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
28ed0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
28ee0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
28ef0 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
28f00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
28f10 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28f20 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
28f30 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  = btreeRestoreCu
28f40 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
28f50 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  r);.  return rc 
28f60 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61 79  ? rc : accessPay
28f70 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
28f80 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
28f90 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
28fa0 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
28fb0 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
28fc0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
28fd0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
28fe0 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  uf){.  if( pCur-
28ff0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29000 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
29010 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
29020 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
29030 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
29040 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
29050 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
29060 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f, 0);.  }else{.
29070 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73      return acces
29080 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  sPayloadChecked(
29090 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
290a0 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a  t, pBuf);.  }.}.
290b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
290c0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
290d0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
290e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
290f0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
29100 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
29110 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
29120 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
29130 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
29140 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
29150 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
29160 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
29170 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
29180 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
29190 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
291a0 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
291b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
291c0 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
291d0 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
291e0 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
291f0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
29200 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
29210 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
29220 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
29230 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
29240 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
29250 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29260 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
29270 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
29280 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
29290 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
292a0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
292b0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
292c0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
292d0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
292e0 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
292f0 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
29300 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
29310 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
29320 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
29330 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
29340 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
29350 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
29360 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
29370 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
29380 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
29390 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
293a0 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
293b0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
293c0 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
293d0 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
293e0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
293f0 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
29400 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
29410 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
29420 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
29430 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
29440 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
29450 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
29460 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
29470 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
29480 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
29490 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
294a0 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
294b0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
294c0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
294d0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
294e0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
294f0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
29500 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
29510 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
29520 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
29530 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
29540 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20  ){.  int amt;.  
29550 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
29560 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
29570 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
29580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29590 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
295a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
295b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
295c0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
295d0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
295e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
295f0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
29600 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
29610 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
29620 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
29630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29640 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
29650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29660 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
29670 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  >pCur->pPage->aD
29680 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ata || CORRUPT_D
29690 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
296a0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
296b0 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ad<pCur->pPage->
296c0 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55  aDataEnd ||CORRU
296d0 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20  PT_DB);.  amt = 
296e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
296f0 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28 69 6e  l;.  if( amt>(in
29700 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t)(pCur->pPage->
29710 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
29720 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 20  >info.pPayload) 
29730 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
29740 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73 70  is too little sp
29750 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
29760 66 6f 72 20 74 68 65 20 65 78 70 65 63 74 65 64  for the expected
29770 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20 6f   amount.    ** o
29780 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74 2e  f local content.
29790 20 44 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   Database must b
297a0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
297b0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
297c0 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d 74 20  T_DB );.    amt 
297d0 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29 28 70  = MAX(0, (int)(p
297e0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
297f0 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
29800 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20 20  o.pPayload));.  
29810 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75 33 32  }.  *pAmt = (u32
29820 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  )amt;.  return (
29830 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
29840 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
29850 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
29860 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
29870 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
29880 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
29890 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
298a0 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
298b0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
298c0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
298d0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
298e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
298f0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
29900 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
29910 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
29920 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
29930 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
29940 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
29950 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
29960 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
29970 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
29980 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
29990 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
299a0 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
299b0 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
299c0 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
299d0 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
299e0 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
299f0 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
29a00 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
29a10 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
29a20 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
29a30 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
29a40 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
29a50 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
29a60 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
29a70 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
29a80 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
29a90 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
29aa0 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
29ab0 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  dFetch(BtCursor 
29ac0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
29ad0 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
29ae0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
29af0 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Amt);.}.../*.** 
29b00 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29b10 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
29b20 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
29b30 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
29b40 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
29b50 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
29b60 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
29b70 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
29b80 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
29b90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
29ba0 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
29bb0 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
29bc0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
29bd0 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
29be0 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
29bf0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
29c00 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
29c10 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
29c20 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
29c30 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
29c40 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
29c50 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
29c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
29c70 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
29c80 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
29c90 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61  ewPgno){.  BtSha
29ca0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
29cb0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
29cc0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29cd0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
29ce0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29cf0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29d00 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29d10 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
29d20 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
29d30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29d40 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
29d50 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
29d60 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
29d70 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
29d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29d90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
29da0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
29db0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
29dc0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
29dd0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
29de0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43  ValidOvfl);.  pC
29df0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29e00 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 69  iPage] = pCur->i
29e10 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  x;.  pCur->apPag
29e20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  e[pCur->iPage] =
29e30 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
29e40 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
29e50 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20  pCur->iPage++;. 
29e60 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e   return getAndIn
29e70 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
29e80 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  gno, &pCur->pPag
29e90 65 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63  e, pCur, pCur->c
29ea0 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d  urPagerFlags);.}
29eb0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
29ec0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
29ed0 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
29ee0 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
29ef0 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
29f00 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
29f10 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
29f20 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
29f30 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
29f40 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
29f50 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
29f60 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
29f70 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
29f80 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
29f90 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
29fa0 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
29fb0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
29fc0 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
29fd0 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
29fe0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
29ff0 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
2a000 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
2a010 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
2a020 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
2a030 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
2a040 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  B ) return;  /* 
2a050 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  The conditions t
2a060 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68  ested below migh
2a070 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20  t not be true.  
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a090 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
2a0a0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
2a0b0 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
2a0c0 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
2a0d0 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
2a0e0 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
2a0f0 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
2a100 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
2a110 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2a120 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2a130 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
2a140 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2a150 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
2a160 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
2a170 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
2a180 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
2a190 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
2a1a0 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
2a1b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
2a1c0 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
2a1d0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2a1e0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
2a1f0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
2a200 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
2a210 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
2a220 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
2a230 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
2a240 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
2a250 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
2a260 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
2a270 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
2a280 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
2a290 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
2a2a0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
2a2b0 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
2a2c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
2a2d0 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
2a2e0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2a2f0 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 3b 0a 20  emPage *pLeaf;. 
2a300 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2a310 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2a320 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2a330 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a340 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2a350 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2a360 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
2a370 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  ( pCur->pPage );
2a380 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
2a390 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
2a3a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a3b0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
2a3c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a3d0 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
2a3e0 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  r->pPage->pgno. 
2a3f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2a400 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a410 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
2a420 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a430 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
2a440 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2a450 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2a460 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2a470 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2a480 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2a490 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 43  .  pCur->ix = pC
2a4a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a4b0 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70 4c 65 61  iPage-1];.  pLea
2a4c0 66 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  f = pCur->pPage;
2a4d0 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
2a4e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 2d 2d   pCur->apPage[--
2a4f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2a500 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2a510 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a  ll(pLeaf);.}../*
2a520 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2a530 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
2a540 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2a550 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75   its b-tree stru
2a560 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
2a570 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
2a580 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
2a590 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
2a5a0 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70  or is moved to p
2a5b0 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76  oint.** to the v
2a5c0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2a5d0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
2a5e0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
2a5f0 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a  . A table has a.
2a600 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
2a610 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63  page when the ac
2a620 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63  tual root page c
2a630 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
2a640 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c   and a .** singl
2a650 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68  e child page. Th
2a660 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
2a670 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  en with the tabl
2a680 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
2a690 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   1..**.** If the
2a6a0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
2a6b0 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
2a6c0 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
2a6d0 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f  set to .** CURSO
2a6e0 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64 20 74 68  R_INVALID and th
2a6f0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2a700 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e  ns SQLITE_EMPTY.
2a710 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74   Otherwise,.** t
2a720 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
2a730 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2a740 20 66 69 72 73 74 20 63 65 6c 6c 20 6c 6f 63 61   first cell loca
2a750 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 0a  ted on the root.
2a760 2a 2a 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ** (or virtual r
2a770 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
2a780 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
2a790 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
2a7a0 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
2a7b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2a7c0 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
2a7d0 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
2a7e0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
2a7f0 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
2a800 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
2a810 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
2a820 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
2a830 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
2a840 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
2a850 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
2a860 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
2a870 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
2a880 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
2a890 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
2a8a0 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
2a8b0 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
2a8c0 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
2a8d0 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
2a8e0 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
2a8f0 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
2a900 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
2a910 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
2a920 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
2a930 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
2a940 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
2a950 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
2a960 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
2a970 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
2a980 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2a990 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
2a9a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2a9b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2a9c0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a9d0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a9e0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
2a9f0 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
2aa00 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
2aa10 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2aa20 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
2aa30 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2aa40 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
2aa50 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
2aa60 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2aa70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2aa80 2d 3e 65 53 74 61 74 65 20 3c 20 43 55 52 53 4f  ->eState < CURSO
2aa90 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 7c 7c  R_REQUIRESEEK ||
2aaa0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29   pCur->iPage<0 )
2aab0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2aac0 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20  ->pgnoRoot>0 || 
2aad0 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b  pCur->iPage<0 );
2aae0 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
2aaf0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  age>=0 ){.    if
2ab00 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b  ( pCur->iPage ){
2ab10 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2ab20 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
2ab30 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 77 68  pPage);.      wh
2ab40 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e 69 50 61  ile( --pCur->iPa
2ab50 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ge ){.        re
2ab60 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
2ab70 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
2ab80 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 20  ur->iPage]);.   
2ab90 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2aba0 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
2abb0 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20 20 20  pPage[0];.      
2abc0 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a  goto skip_init;.
2abd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2abe0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2abf0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
2ac00 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2ac10 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
2ac20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54  turn SQLITE_EMPT
2ac30 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
2ac40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2ac50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20  age==(-1) );.   
2ac60 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ac70 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
2ac80 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 20 20 69  ESEEK ){.      i
2ac90 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2aca0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
2acb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2acc0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
2acd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2ace0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
2acf0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
2ad00 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2ad10 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
2ad20 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  or(pCur);.    }.
2ad30 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
2ad40 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42  nitPage(pCur->pB
2ad50 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d  tree->pBt, pCur-
2ad60 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
2ad70 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20 20 20  ->pPage,.       
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad90 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67   0, pCur->curPag
2ada0 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  erFlags);.    if
2adb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2adc0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
2add0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2ade0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
2adf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2ae00 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
2ae10 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   0;.    pCur->cu
2ae20 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e  rIntKey = pCur->
2ae30 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20  pPage->intKey;. 
2ae40 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
2ae50 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
2ae60 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
2ae70 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
2ae80 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72  );..  /* If pCur
2ae90 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
2aea0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
2aeb0 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
2aec0 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
2aed0 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
2aee0 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
2aef0 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
2af00 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
2af10 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c  nfo is.  ** NULL
2af20 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
2af30 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
2af40 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
2af50 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
2af60 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
2af70 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
2af80 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  r. .  **.  ** Ea
2af90 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
2afa0 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64  f SQLite assumed
2afb0 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
2afc0 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20  could not fail. 
2afd0 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20   ** if the root 
2afe0 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79  page was already
2aff0 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69   loaded when thi
2b000 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
2b010 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a  alled (i.e..  **
2b020 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   if pCur->iPage>
2b030 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  =0). But this is
2b040 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64   not so if the d
2b050 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
2b060 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75  pted .  ** in su
2b070 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61  ch a way that pa
2b080 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b  ge pRoot is link
2b090 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64  ed into a second
2b0a0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20   b-tree table . 
2b0b0 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65   ** (or the free
2b0c0 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73  list).  */.  ass
2b0d0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  ert( pRoot->intK
2b0e0 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e  ey==1 || pRoot->
2b0f0 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69  intKey==0 );.  i
2b100 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  f( pRoot->isInit
2b110 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b  ==0 || (pCur->pK
2b120 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f  eyInfo==0)!=pRoo
2b130 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  t->intKey ){.   
2b140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2b150 4f 52 52 55 50 54 5f 50 41 47 45 28 70 43 75 72  ORRUPT_PAGE(pCur
2b160 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 73  ->pPage);.  }..s
2b170 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43  kip_init:  .  pC
2b180 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43  ur->ix = 0;.  pC
2b190 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2b1a0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2b1b0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
2b1c0 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2b1d0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2b1e0 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d  vfl);..  pRoot =
2b1f0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2b200 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
2b210 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
2b220 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2b230 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
2b240 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
2b250 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
2b260 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
2b270 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
2b280 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2b290 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
2b2a0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
2b2b0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
2b2c0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
2b2d0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
2b2e0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2b2f0 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
2b300 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2b310 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
2b320 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
2b330 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2b340 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
2b350 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
2b360 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b370 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2b380 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2b390 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
2b3a0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
2b3b0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
2b3c0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
2b3d0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
2b3e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
2b3f0 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
2b400 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
2b410 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
2b420 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
2b430 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
2b440 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2b450 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
2b460 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
2b470 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
2b480 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b490 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2b4a0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2b4b0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2b4c0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b4d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b4e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b4f0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2b500 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
2b510 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
2b520 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
2b530 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2b540 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2b550 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2b560 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2b570 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b 0a 20  e, pCur->ix));. 
2b580 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2b590 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
2b5a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b5b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2b5c0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
2b5d0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
2b5e0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
2b5f0 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
2b600 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
2b610 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2b620 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
2b630 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
2b640 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
2b650 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
2b660 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
2b670 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
2b680 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
2b690 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
2b6a0 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
2b6b0 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
2b6c0 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
2b6d0 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
2b6e0 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
2b6f0 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
2b700 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
2b710 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
2b720 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
2b730 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
2b740 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
2b750 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
2b760 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2b770 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
2b780 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
2b790 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
2b7a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b7b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2b7c0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2b7d0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2b7e0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2b7f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b800 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2b810 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28  D );.  while( !(
2b820 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2b830 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
2b840 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2b850 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2b860 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2b870 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
2b880 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ix = pPage->nCel
2b890 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
2b8a0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
2b8b0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
2b8c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
2b8d0 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50  .  pCur->ix = pP
2b8e0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2b8f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2b900 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2b910 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2b920 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2b930 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b  ValidNKey)==0 );
2b940 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b950 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
2b960 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2b970 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2b980 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2b990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2b9a0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2b9b0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2b9c0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2b9d0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2b9e0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2b9f0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2ba00 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2ba10 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2ba20 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
2ba30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2ba40 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2ba50 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
2ba60 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2ba70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ba80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ba90 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2baa0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2bab0 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
2bac0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2bad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bae0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2baf0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2bb00 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  l>0 );.    *pRes
2bb10 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
2bb20 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2bb30 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ur);.  }else if(
2bb40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
2bb50 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  Y ){.    assert(
2bb60 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2bb70 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
2bb80 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2bb90 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2bba0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2bbb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2bbc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2bbd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2bbe0 6f 2d 6f 70 20 69 66 20 63 75 72 73 6f 72 20 70  o-op if cursor p
2bbf0 43 75 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69  Cur does not poi
2bc00 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  nt to a valid ro
2bc10 77 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  w..** Otherwise,
2bc20 20 69 66 20 70 43 75 72 20 69 73 20 76 61 6c 69   if pCur is vali
2bc30 64 2c 20 63 6f 6e 66 69 67 75 72 65 20 69 74 20  d, configure it 
2bc40 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
2bc50 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
2bc60 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 69  te3BtreeNext() i
2bc70 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69  s a no-op..*/.#i
2bc80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2bc90 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 76 6f 69  T_WINDOWFUNC.voi
2bca0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 6b  d sqlite3BtreeSk
2bcb0 69 70 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  ipNext(BtCursor 
2bcc0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 57 65 20  *pCur){.  /* We 
2bcd0 62 65 6c 69 65 76 65 20 74 68 61 74 20 74 68 65  believe that the
2bce0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 61 6c 77   cursor must alw
2bcf0 61 79 73 20 62 65 20 69 6e 20 74 68 65 20 76 61  ays be in the va
2bd00 6c 69 64 20 73 74 61 74 65 20 77 68 65 6e 0a 20  lid state when. 
2bd10 20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65   ** this routine
2bd20 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 75 74 20   is called, but 
2bd30 74 68 65 20 70 72 6f 6f 66 20 69 73 20 64 69 66  the proof is dif
2bd40 66 69 63 75 6c 74 2c 20 73 6f 20 77 65 20 61 64  ficult, so we ad
2bd50 64 20 61 6e 0a 20 20 2a 2a 20 41 4c 57 61 59 53  d an.  ** ALWaYS
2bd60 28 29 20 74 65 73 74 20 6a 75 73 74 20 69 6e 20  () test just in 
2bd70 63 61 73 65 20 77 65 20 61 72 65 20 77 72 6f 6e  case we are wron
2bd80 67 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  g. */.  if( ALWA
2bd90 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  YS(pCur->eState=
2bda0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29  =CURSOR_VALID) )
2bdb0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2bdc0 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50  te = CURSOR_SKIP
2bdd0 4e 45 58 54 3b 0a 20 20 20 20 70 43 75 72 2d 3e  NEXT;.    pCur->
2bde0 73 6b 69 70 4e 65 78 74 20 3d 20 31 3b 0a 20 20  skipNext = 1;.  
2bdf0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
2be00 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
2be10 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 20 4d 6f 76 65  FUNC */../* Move
2be20 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2be30 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2be40 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2be50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2be60 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2be70 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2be80 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2be90 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2bea0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2beb0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2bec0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2bed0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2bee0 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2bef0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2bf00 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2bf10 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2bf20 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2bf30 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2bf40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2bf50 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2bf60 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2bf70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2bf80 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2bf90 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2bfa0 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2bfb0 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2bfc0 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2bfd0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2bfe0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2bff0 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2c000 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2c010 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2c020 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2c030 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2c040 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2c050 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2c060 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2c070 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2c080 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2c090 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2c0a0 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2c0b0 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2c0c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c0d0 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2c0e0 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2c0f0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2c100 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c110 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d  ix==pCur->pPage-
2c120 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
2c130 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2c140 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  age->leaf );.#en
2c150 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
2c160 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2c170 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2c180 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2c190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c1a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2c1b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2c1c0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52  VALID );.    *pR
2c1d0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  es = 0;.    rc =
2c1e0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2c1f0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2c200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c210 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
2c220 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
2c230 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Last;.    }else{
2c240 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
2c250 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
2c260 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  tLast;.    }.  }
2c270 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2c280 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2c290 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2c2a0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2c2b0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2c2c0 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
2c2d0 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
2c2e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2c2f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c300 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2c310 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
2c320 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
2c330 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
2c340 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
2c350 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
2c360 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
2c370 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
2c380 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
2c390 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
2c3a0 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
2c3b0 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
2c3c0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
2c3d0 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
2c3e0 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
2c3f0 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
2c400 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
2c410 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
2c420 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
2c430 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
2c440 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
2c450 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
2c460 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
2c470 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
2c480 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
2c490 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
2c4a0 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
2c4b0 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
2c4c0 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
2c4d0 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
2c4e0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
2c4f0 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
2c500 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
2c510 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
2c520 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
2c530 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
2c540 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
2c550 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
2c560 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
2c570 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
2c580 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
2c590 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
2c5a0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2c5b0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
2c5c0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2c5d0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2c5e0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2c5f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2c600 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
2c610 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2c620 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
2c630 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
2c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c650 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
2c660 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
2c670 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
2c680 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
2c690 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
2c6a0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2c6b0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2c6c0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2c6d0 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
2c6e0 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
2c6f0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2c700 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
2c710 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2c720 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2c730 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2c740 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2c750 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
2c760 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
2c770 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64  y..**.** For ind
2c780 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70  ex tables, the p
2c790 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66  IdxKey->eqSeen f
2c7a0 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31  ield is set to 1
2c7b0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69   if there.** exi
2c7c0 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  sts an entry in 
2c7d0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65  the table that e
2c7e0 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70  xactly matches p
2c7f0 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74  IdxKey.  .*/.int
2c800 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2c810 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
2c820 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
2c830 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2c840 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
2c850 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
2c860 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
2c870 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
2c880 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
2c890 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
2c8a0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2c8b0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
2c8c0 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
2c8d0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
2c8e0 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
2c8f0 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
2c900 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
2c910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c920 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
2c930 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
2c940 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f    int rc;.  Reco
2c950 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72  rdCompare xRecor
2c960 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73  dCompare;..  ass
2c970 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2c980 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2c990 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2c9a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2c9b0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2c9c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2c9d0 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
2c9e0 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
2c9f0 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
2ca00 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  nfo==0) );.  ass
2ca10 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2ca20 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2ca30 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  || (pIdxKey==0)=
2ca40 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  =(pCur->curIntKe
2ca50 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  y!=0) );..  /* I
2ca60 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2ca70 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
2ca80 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
2ca90 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
2caa0 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
2cab0 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
2cac0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
2cad0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
2cae0 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26  pIdxKey==0.   &&
2caf0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2cb00 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
2cb10 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2cb20 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2cb30 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  !=0.  ){.    if(
2cb40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2cb50 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2cb60 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2cb70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cb80 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2cb90 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2cba0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2cbb0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2cbc0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
2cbd0 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Last)!=0 ){.    
2cbe0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2cbf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2cc00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2cc10 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  }.      /* If th
2cc20 65 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20  e requested key 
2cc30 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  is one more than
2cc40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65   the previous ke
2cc50 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  y, then.      **
2cc60 20 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72   try to get ther
2cc70 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42  e using sqlite3B
2cc80 74 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65  treeNext() rathe
2cc90 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20  r than a full.  
2cca0 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65      ** binary se
2ccb0 61 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61  arch.  This is a
2ccc0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  n optimization o
2ccd0 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63  nly.  The correc
2cce0 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a  t answer.      *
2ccf0 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69  * is still obtai
2cd00 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73  ned without this
2cd10 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69   case, only a li
2cd20 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c  ttle more slowel
2cd30 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  y */.      if( p
2cd40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31  Cur->info.nKey+1
2cd50 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21 70 43 75  ==intKey && !pCu
2cd60 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2cd70 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2cd80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2cd90 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2cda0 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  pCur, 0);.      
2cdb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cdc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2cdd0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
2cde0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
2cdf0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2ce00 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
2ce10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2ce20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2ce30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ce40 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2ce50 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
2ce60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ce70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  E_OK;.        }e
2ce80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
2ce90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2cea0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ceb0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64  }.  }..  if( pId
2cec0 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63  xKey ){.    xRec
2ced0 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c  ordCompare = sql
2cee0 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
2cef0 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  are(pIdxKey);.  
2cf00 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f    pIdxKey->errCo
2cf10 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  de = 0;.    asse
2cf20 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66  rt( pIdxKey->def
2cf30 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20  ault_rc==1 .    
2cf40 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2cf50 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a  >default_rc==0 .
2cf60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2cf70 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2cf80 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  =-1.    );.  }el
2cf90 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43  se{.    xRecordC
2cfa0 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41  ompare = 0; /* A
2cfb0 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65  ll keys are inte
2cfc0 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72  gers */.  }..  r
2cfd0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2cfe0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
2cff0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
2d000 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20  LITE_EMPTY ){.  
2d010 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2d020 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2d030 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
2d040 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
2d050 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
2d060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d070 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
2d080 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2d090 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2d0a0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
2d0b0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49  pCur->pPage->isI
2d0c0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
2d0d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2d0e0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2d0f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2d100 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20  Page->nCell > 0 
2d110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d120 72 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70  r->iPage==0 || p
2d130 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
2d140 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75  intKey==pCur->cu
2d150 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73  rIntKey );.  ass
2d160 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
2d170 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
2d180 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
2d190 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20    int lwr, upr, 
2d1a0 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f  idx, c;.    Pgno
2d1b0 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
2d1c0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2d1d0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75  ur->pPage;.    u
2d1e0 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
2d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d200 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2d210 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
2d220 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f   pPage */..    /
2d230 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d  * pPage->nCell m
2d240 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
2d250 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69  han zero. If thi
2d260 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  s is the root-pa
2d270 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  ge.    ** the cu
2d280 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20  rsor would have 
2d290 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f  been INVALID abo
2d2a0 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28  ve and this for(
2d2b0 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20  ;;) loop.    ** 
2d2c0 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73  not run. If this
2d2d0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74   is not the root
2d2e0 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20  -page, then the 
2d2f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f  moveToChild() ro
2d300 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75  utine.    ** wou
2d310 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
2d320 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72  detected db corr
2d330 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c  uption. Similarl
2d340 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20  y, pPage must.  
2d350 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68    ** be the righ
2d360 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72  t kind (index or
2d370 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65   table) of b-tre
2d380 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  e page. Otherwis
2d390 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54  e.    ** a moveT
2d3a0 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65  oChild() or move
2d3b0 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f  ToRoot() call wo
2d3c0 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
2d3d0 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  d corruption.  *
2d3e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2d3f0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
2d400 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d410 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78  e->intKey==(pIdx
2d420 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c  Key==0) );.    l
2d430 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
2d440 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
2d450 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69  ;.    assert( bi
2d460 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69  asRight==0 || bi
2d470 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20  asRight==1 );.  
2d480 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d    idx = upr>>(1-
2d490 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69  biasRight); /* i
2d4a0 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f  dx = biasRight ?
2d4b0 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29   upr : (lwr+upr)
2d4c0 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  /2; */.    pCur-
2d4d0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2d4e0 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43      if( xRecordC
2d4f0 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20  ompare==0 ){.   
2d500 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2d510 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
2d520 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
2d530 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
2d540 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20  r(pPage, idx);. 
2d550 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2d560 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
2d570 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2d580 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c   0x80 <= *(pCell
2d590 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
2d5a0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50     if( pCell>=pP
2d5b0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b  age->aDataEnd ){
2d5c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2d5d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2d5e0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
2d5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2d600 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
2d620 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
2d630 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
2d640 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2d650 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
2d660 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2d670 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  idx+1;.         
2d680 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2d690 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d  c = -1; break; }
2d6a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2d6b0 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  f( nCellKey>intK
2d6c0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2d6d0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2d6e0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2d6f0 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72  pr ){ c = +1; br
2d700 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2d710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2d720 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
2d730 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ==intKey );.    
2d740 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d        pCur->ix =
2d750 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2d760 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
2d770 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2d780 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
2d790 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2d7a0 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79   moveto_next_lay
2d7b0 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  er;.          }e
2d7c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2d7d0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2d7e0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
2d7f0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y;.            p
2d800 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
2d810 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2d820 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
2d830 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
2d840 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2d850 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2d860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d870 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d890 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
2d8a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
2d8b0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
2d8c0 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
2d8d0 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2d8e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2d8f0 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
2d900 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b        int nCell;
2d910 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
2d920 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62   pCell cell in b
2d930 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
2d940 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2d950 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69  PastPtr(pPage, i
2d960 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  dx);..        /*
2d970 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70   The maximum sup
2d980 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65  ported page-size
2d990 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e   is 65536 bytes.
2d9a0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
2d9b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2d9c0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
2d9d0 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73  f record bytes s
2d9e0 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65  tored on an inde
2d9f0 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20  x B-Tree.       
2da00 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73   ** page is less
2da10 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65   than 16384 byte
2da20 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f  s and may be sto
2da30 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a  red as a 2-byte.
2da40 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e          ** varin
2da50 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  t. This informat
2da60 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
2da70 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20  ttempt to avoid 
2da80 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20  parsing .       
2da90 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63   ** the entire c
2daa0 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ell by checking 
2dab0 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68  for the cases wh
2dac0 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  ere the record i
2dad0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  s .        ** st
2dae0 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69  ored entirely wi
2daf0 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
2db00 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69  page by inspecti
2db10 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  ng the first .  
2db20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73        ** 2 bytes
2db30 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20   of the cell..  
2db40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2db50 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30   nCell = pCell[0
2db60 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ];.        if( n
2db70 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  Cell<=pPage->max
2db80 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a  1bytePayload ){.
2db90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
2dba0 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
2dbb0 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
2dbc0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
2dbd0 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
2dbe0 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
2dbf0 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
2dc00 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
2dc10 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2dc20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
2dc30 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
2dc40 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2dc50 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31  e( pCell+nCell+1
2dc60 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
2dc70 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
2dc80 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2dc90 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
2dca0 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b  &pCell[1], pIdxK
2dcb0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
2dcc0 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
2dcd0 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
2dce0 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
2dcf0 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
2dd00 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
2dd10 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
2dd20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2dd30 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
2dd40 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
2dd50 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
2dd60 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2dd70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
2dd80 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
2dd90 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
2dda0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
2ddb0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
2ddc0 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67  ll+nCell+2==pPag
2ddd0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
2dde0 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2ddf0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2de00 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
2de10 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
2de20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2de30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2de40 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
2de50 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
2de60 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
2de70 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
2de80 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
2de90 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
2dea0 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
2deb0 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
2dec0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
2ded0 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
2dee0 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
2def0 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
2df00 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
2df10 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
2df20 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
2df30 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
2df40 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20  lled. .         
2df50 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
2df60 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
2df70 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78  s corrupt, the x
2df80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f  RecordCompare ro
2df90 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20  utine may read. 
2dfa0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74           ** up t
2dfb0 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61  o two varints pa
2dfc0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2dfd0 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74  e buffer. An ext
2dfe0 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20  ra 18 .         
2dff0 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64   ** bytes of pad
2e000 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65  ding is allocate
2e010 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
2e020 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20  the buffer in.  
2e030 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
2e040 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a  this happens.  *
2e050 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
2e060 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
2e070 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
2e080 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
2e090 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
2e0a0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
2e0b0 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
2e0c0 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
2e0d0 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
2e0e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2e0f0 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
2e100 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
2e110 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2e120 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f  ( nCell<0 );   /
2e130 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69  * True if key si
2e140 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f  ze is 2^32 or mo
2e150 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
2e160 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2e170 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69  =0 );  /* Invali
2e180 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38  d key size:  0x8
2e190 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20  0 0x80 0x00 */. 
2e1a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2e1b0 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20  e( nCell==1 );  
2e1c0 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2e1d0 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2e1e0 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x01 */.        
2e1f0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2e200 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  l==2 );  /* Mini
2e210 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20  mum legal index 
2e220 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  key size */.    
2e230 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2e240 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
2e250 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2e260 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
2e270 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2e280 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2e290 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e2a0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
2e2b0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2e2c0 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20  ( nCell+18 );.  
2e2d0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2e2e0 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lKey==0 ){.     
2e2f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2e300 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2e310 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2e320 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2e330 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e340 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2e350 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2e360 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
2e370 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
2e380 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
2e390 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
2e3a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
2e3b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2e3c0 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c   ~BTCF_ValidOvfl
2e3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e3e0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2e3f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2e400 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2e410 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2e420 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2e430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e440 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2e450 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
2e460 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
2e470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e480 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
2e490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e4a0 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
2e4b0 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d         (pIdxKey-
2e4c0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2e4d0 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30  _CORRUPT || c==0
2e4e0 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
2e4f0 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2e500 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
2e510 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
2e520 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
2e530 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2e540 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
2e550 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2e560 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx+1;.        }e
2e570 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20  lse if( c>0 ){. 
2e580 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2e590 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx-1;.        }e
2e5a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2e5b0 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20  ssert( c==0 );. 
2e5c0 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2e5d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2e5e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e5f0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
2e600 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2e610 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b         if( pIdxK
2e620 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63  ey->errCode ) rc
2e630 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2e640 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2e650 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2e660 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
2e670 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2e680 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
2e690 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2e6a0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2e6b0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2e6c0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2e6d0 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2e6e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e6f0 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2e700 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2e710 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2e720 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2e730 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2e740 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2e750 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e760 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2e770 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67  r->ix<pCur->pPag
2e780 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2e790 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2e7a0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
2e7b0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
2e7c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e7d0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2e7e0 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
2e7f0 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
2e800 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
2e810 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2e820 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2e830 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2e840 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2e850 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
2e860 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
2e870 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
2e880 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
2e890 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
2e8a0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77  ur->ix = (u16)lw
2e8b0 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
2e8c0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
2e8d0 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
2e8e0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
2e8f0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
2e900 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e910 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2e920 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2e930 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2e940 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2e950 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
2e960 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2e970 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2e980 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2e990 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
2e9a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
2e9b0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
2e9c0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
2e9d0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2e9e0 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
2e9f0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2ea00 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
2ea10 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
2ea20 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
2ea30 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
2ea40 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
2ea50 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
2ea60 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2ea70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2ea80 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
2ea90 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
2eaa0 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
2eab0 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
2eac0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
2ead0 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
2eae0 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
2eaf0 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
2eb00 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
2eb10 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
2eb20 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
2eb30 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
2eb40 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
2eb50 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
2eb60 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
2eb70 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
2eb80 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
2eb90 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61  Return an estima
2eba0 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  te for the numbe
2ebb0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2ebc0 20 74 61 62 6c 65 20 74 68 61 74 20 70 43 75 72   table that pCur
2ebd0 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20   is.** pointing 
2ebe0 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  to.  Return a ne
2ebf0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
2ec00 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20   no estimate is 
2ec10 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76  currently .** av
2ec20 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20  ailable..*/.i64 
2ec30 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43  sqlite3BtreeRowC
2ec40 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72  ountEst(BtCursor
2ec50 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e   *pCur){.  i64 n
2ec60 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73  ;.  u8 i;..  ass
2ec70 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2ec80 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2ec90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2eca0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2ecb0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2ecc0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
2ecd0 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69  Currently this i
2ece0 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79  nterface is only
2ecf0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f   called by the O
2ed00 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a  P_IfSmaller.  **
2ed10 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20   opcode, and it 
2ed20 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63 75  that case the cu
2ed30 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73  rsor will always
2ed40 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20   be valid and.  
2ed50 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70  ** will always p
2ed60 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e  oint to a leaf n
2ed70 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ode. */.  if( NE
2ed80 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65  VER(pCur->eState
2ed90 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  !=CURSOR_VALID) 
2eda0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69  ) return -1;.  i
2edb0 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 70  f( NEVER(pCur->p
2edc0 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 20 29  Page->leaf==0) )
2edd0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e   return -1;..  n
2ede0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   = pCur->pPage->
2edf0 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30  nCell;.  for(i=0
2ee00 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b  ; i<pCur->iPage;
2ee10 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20   i++){.    n *= 
2ee20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
2ee30 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65  >nCell;.  }.  re
2ee40 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
2ee50 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
2ee60 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
2ee70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2ee80 61 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74 75 72  abase. .** Retur
2ee90 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  n value:.**.**  
2eea0 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20    SQLITE_OK     
2eeb0 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20     success.**   
2eec0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20   SQLITE_DONE    
2eed0 20 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65    cursor is alre
2eee0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ady pointing at 
2eef0 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
2ef00 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65  .**    otherwise
2ef10 20 20 20 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e          some kin
2ef20 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72  d of error occur
2ef30 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  red.**.** The ma
2ef40 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2ef50 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  s sqlite3BtreeNe
2ef60 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  xt().  That rout
2ef70 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2ef80 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2ef90 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2efa0 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  y incrementing t
2efb0 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2efc0 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2efd0 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65  * to the next ce
2efe0 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2eff0 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2f000 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28  ower) btreeNext(
2f010 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74  ) helper.** rout
2f020 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2f030 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2f040 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2f050 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f  different page o
2f060 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20  r.** to restore 
2f070 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2f080 2a 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66  * If bit 0x01 of
2f090 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   the F argument 
2f0a0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  in sqlite3BtreeN
2f0b0 65 78 74 28 43 2c 46 29 20 69 73 20 31 2c 20 74  ext(C,F) is 1, t
2f0c0 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  hen the.** curso
2f0d0 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
2f0e0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
2f0f0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  d this routine c
2f100 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a  ould have been.*
2f110 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  * skipped if the
2f120 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2f130 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64  een a unique ind
2f140 65 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d  ex.  The F argum
2f150 65 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69 6e 74  ent.** is a hint
2f160 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
2f170 74 2e 20 20 53 51 4c 69 74 65 20 62 74 72 65 65  t.  SQLite btree
2f180 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2f190 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
2f1a0 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43  this hint, but C
2f1b0 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73  OMDB2 does..*/.s
2f1c0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2f1d0 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e  NLINE int btreeN
2f1e0 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2f1f0 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
2f200 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
2f210 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2f220 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2f230 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2f240 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2f250 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2f260 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2f270 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2f280 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2f290 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f2a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2f2b0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2f2c0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2f2d0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  )==0 );.    rc =
2f2e0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2f2f0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2f300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2f320 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2f330 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2f340 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2f350 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  te ){.      retu
2f360 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
2f370 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2f380 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2f390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2f3a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2f3b0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2f3c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2f3d0 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2f3e0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2f3f0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2f400 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2f410 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
2f420 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2f430 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2f440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f450 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2f460 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2f470 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2f480 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2f490 3e 70 50 61 67 65 3b 0a 20 20 69 64 78 20 3d 20  >pPage;.  idx = 
2f4a0 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 69 66  ++pCur->ix;.  if
2f4b0 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
2f4c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f   ){.    /* The o
2f4d0 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79 20 66 6f  nly known way fo
2f4e0 72 20 74 68 69 73 20 74 6f 20 68 61 70 70 65 6e  r this to happen
2f4f0 20 69 73 20 66 6f 72 20 74 68 65 72 65 20 74 6f   is for there to
2f500 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 72 65 63   be a.    ** rec
2f510 75 72 73 69 76 65 20 53 51 4c 20 66 75 6e 63 74  ursive SQL funct
2f520 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 61 20  ion that does a 
2f530 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
2f540 20 61 73 20 70 61 72 74 20 6f 66 20 61 0a 20 20   as part of a.  
2f550 20 20 2a 2a 20 53 45 4c 45 43 54 20 77 68 69 63    ** SELECT whic
2f560 68 20 64 65 6c 65 74 65 73 20 63 6f 6e 74 65 6e  h deletes conten
2f570 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  t out from under
2f580 20 61 6e 20 61 63 74 69 76 65 20 63 75 72 73 6f   an active curso
2f590 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f  r.    ** in a co
2f5a0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
2f5b0 69 6c 65 20 77 68 65 72 65 20 74 68 65 20 74 61  ile where the ta
2f5c0 62 6c 65 20 62 65 69 6e 67 20 44 45 4c 45 54 45  ble being DELETE
2f5d0 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  -ed from.    ** 
2f5e0 68 61 73 20 70 61 67 65 73 20 69 6e 20 63 6f 6d  has pages in com
2f5f0 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  mon with the tab
2f600 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
2f610 2e 20 20 53 65 65 20 54 48 33 0a 20 20 20 20 2a  .  See TH3.    *
2f620 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31 2f 62 74  * module cov1/bt
2f630 72 65 65 37 38 2e 74 65 73 74 20 74 65 73 74 63  ree78.test testc
2f640 61 73 65 20 32 32 30 20 28 32 30 31 38 2d 30 36  ase 220 (2018-06
2f650 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20 20 20 20  -08) for an.    
2f660 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20  ** example. */. 
2f670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f680 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2f690 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2f6a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2f6b0 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20   corrupt, it is 
2f6c0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
2f6d0 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20   value of idx . 
2f6e0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69   ** to be invali
2f6f0 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e  d here. This can
2f700 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61   only occur if a
2f710 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d   second cursor m
2f720 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65  odifies.  ** the
2f730 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73   page while curs
2f740 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69  or pCur is holdi
2f750 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
2f760 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a  o it. Which can.
2f770 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e    ** only happen
2f780 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2f790 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73   is corrupt in s
2f7a0 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20  uch a way as to 
2f7b0 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61  link the.  ** pa
2f7c0 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ge into more tha
2f7d0 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
2f7e0 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73  ucture. */.  tes
2f7f0 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65  tcase( idx>pPage
2f800 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66  ->nCell );..  if
2f810 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
2f820 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
2f830 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f840 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
2f850 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
2f860 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2f870 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2f880 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
2f890 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2f8a0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
2f8b0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2f8c0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2f8d0 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
2f8e0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2f8f0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2f900 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2f910 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2f920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
2f930 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
2f940 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2f950 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
2f960 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2f970 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
2f980 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  r->ix>=pPage->nC
2f990 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
2f9a0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2f9b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
2f9c0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2f9d0 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ur, 0);.    }els
2f9e0 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
2f9f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2fa00 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2fa10 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
2fa20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fa30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2fa40 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2fa50 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
2fa60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2fa70 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
2fa80 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Cur, int flags){
2fa90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2faa0 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  e;.  UNUSED_PARA
2fab0 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20  METER( flags ); 
2fac0 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44   /* Used in COMD
2fad0 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76  B2 but not nativ
2fae0 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73  e SQLite */.  as
2faf0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2fb00 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2fb10 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
2fb20 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
2fb30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2fb40 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2fb50 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2fb60 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2fb70 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2fb80 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2fb90 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2fba0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2fbb0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2fbc0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2fbd0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2fbe0 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
2fbf0 78 74 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67  xt(pCur);.  pPag
2fc00 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2fc10 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
2fc20 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ix)>=pPage->nCel
2fc30 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l ){.    pCur->i
2fc40 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  x--;.    return 
2fc50 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b  btreeNext(pCur);
2fc60 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2fc70 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
2fc80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fc90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2fca0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2fcb0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
2fcc0 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
2fcd0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
2fce0 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
2fcf0 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
2fd00 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74  database..** Ret
2fd10 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  urn values:.**.*
2fd20 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20  *     SQLITE_OK 
2fd30 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20      success.**  
2fd40 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20     SQLITE_DONE  
2fd50 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2fd60 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66 69  lready on the fi
2fd70 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  rst element of t
2fd80 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  he table.**     
2fd90 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 73 6f  otherwise     so
2fda0 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  me kind of error
2fdb0 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20   occurred.**.** 
2fdc0 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2fdd0 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2fde0 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
2fdf0 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2fe00 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2fe10 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2fe20 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
2fe30 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2fe40 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2fe50 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2fe60 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
2fe70 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2fe80 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2fe90 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
2fea0 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
2feb0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2fec0 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
2fed0 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
2fee0 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
2fef0 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
2ff00 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
2ff10 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31 20  .** If bit 0x01 
2ff20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e  of the F argumen
2ff30 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  t to sqlite3Btre
2ff40 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29 20 69  ePrevious(C,F) i
2ff50 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  s 1, then.** the
2ff60 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f   cursor correspo
2ff70 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  nds to an SQL in
2ff80 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75  dex and this rou
2ff90 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
2ffa0 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20  been.** skipped 
2ffb0 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78  if the SQL index
2ffc0 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71   had been a uniq
2ffd0 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46  ue index.  The F
2ffe0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
2fff0 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  * hint to the im
30000 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61  plement.  The na
30010 74 69 76 65 20 53 51 4c 69 74 65 20 62 74 72 65  tive SQLite btre
30020 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
30030 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65   does not.** use
30040 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20   this hint, but 
30050 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a  COMDB2 does..*/.
30060 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
30070 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
30080 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
30090 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
300a0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
300b0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
300c0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
300d0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
300e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
300f0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
30100 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
30110 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
30120 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
30130 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
30140 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
30150 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
30160 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
30170 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
30180 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
30190 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
301a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
301b0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
301c0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
301d0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
301e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
301f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30200 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
30210 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
30220 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
30230 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30240 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  DONE;.    }.    
30250 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
30260 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
30270 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
30280 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
30290 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
302a0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
302b0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
302c0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
302d0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
302e0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
302f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
30300 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
30310 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
30320 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
30330 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
30340 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
30350 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
30360 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
30370 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
30380 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
30390 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
303a0 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
303b0 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20  r->ix;.    rc = 
303c0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
303d0 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
303e0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
303f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
30400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
30410 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
30420 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
30430 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
30440 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20  Cur->ix==0 ){.  
30450 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
30460 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
30470 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
30480 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
30490 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
304a0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
304b0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
304c0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
304d0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
304e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
304f0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
30500 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
30510 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69  ags & (BTCF_Vali
30520 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
30530 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20     pCur->ix--;. 
30540 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
30550 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  >pPage;.    if( 
30560 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
30570 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
30580 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
30590 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
305a0 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
305b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
305c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
305d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
305e0 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
305f0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
30600 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
30610 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
30620 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
30630 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
30640 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
30650 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29  =0 || flags==1 )
30660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
30670 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
30680 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
30690 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
306a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
306b0 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20  R( flags );  /* 
306c0 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62  Used in COMDB2 b
306d0 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51  ut not native SQ
306e0 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  Lite */.  pCur->
306f0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
30700 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
30710 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
30720 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72  lidNKey);.  pCur
30730 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
30740 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
30750 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
30760 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69  ID.   || pCur->i
30770 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d  x==0.   || pCur-
30780 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a  >pPage->leaf==0.
30790 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
307a0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
307b0 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ur);.  }.  pCur-
307c0 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20  >ix--;.  return 
307d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
307e0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
307f0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
30800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
30810 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
30820 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
30830 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
30840 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
30850 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
30860 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
30870 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
30880 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
30890 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
308a0 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
308b0 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
308c0 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
308d0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
308e0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
308f0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
30900 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
30910 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
30920 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
30930 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
30940 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
30950 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
30960 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
30970 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69  rror.  *ppPage i
30980 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e  s set to NULL in
30990 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
309a0 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
309b0 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
309c0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
309d0 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
309e0 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
309f0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
30a00 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
30a10 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
30a20 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
30a30 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
30a40 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
30a50 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
30a60 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
30a70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30a80 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
30a90 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
30aa0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
30ab0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
30ac0 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
30ad0 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
30ae0 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
30af0 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
30b00 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
30b10 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
30b20 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
30b30 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
30b40 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
30b50 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
30b60 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
30b70 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
30b80 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
30b90 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
30ba0 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
30bb0 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
30bc0 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
30bd0 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
30be0 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
30bf0 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
30c00 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
30c10 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
30c20 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
30c30 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
30c40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
30c50 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
30c60 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
30c70 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
30c80 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
30c90 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
30ca0 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
30cb0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
30cc0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
30cd0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
30ce0 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
30cf0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
30d00 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
30d10 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
30d20 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
30d30 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
30d40 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
30d50 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
30d60 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
30d70 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
30d80 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
30d90 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
30da0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
30db0 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
30dc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
30dd0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
30de0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
30df0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
30e00 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
30e10 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
30e20 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
30e30 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
30e40 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
30e50 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
30e60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30e70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
30e80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
30e90 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
30ea0 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
30eb0 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d  rby>0 && IfNotOm
30ec0 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61  itAV(pBt->autoVa
30ed0 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67  cuum)) );.  pPag
30ee0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
30ef0 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
30f00 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
30f10 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
30f20 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33  OF: R-05119-0263
30f30 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  7 The 4-byte big
30f40 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
30f50 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a  at offset 36.  *
30f60 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20  * stores stores 
30f70 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
30f80 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
30f90 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20   freelist. */.  
30fa0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
30fb0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
30fc0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
30fd0 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
30fe0 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
30ff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31000 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
31010 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
31020 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
31030 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
31040 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
31050 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
31060 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
31070 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
31080 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
31090 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
310a0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
310b0 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
310c0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61   */.    u32 nSea
310d0 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  rch = 0;   /* Co
310e0 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
310f0 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65  r of search atte
31100 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20  mpts */.    .   
31110 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
31120 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
31130 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
31140 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
31150 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
31160 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
31170 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
31180 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
31190 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
311a0 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
311b0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
311c0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
311d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
311e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
311f0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
31200 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
31210 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
31220 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
31230 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
31240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
31250 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
31260 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
31270 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
31280 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
31290 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
312a0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
312b0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
312c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
312d0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
312e0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
312f0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
31300 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
31310 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
31320 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
31330 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
31340 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
31350 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
31360 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
31370 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
31380 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
31390 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
313a0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
313b0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
313c0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
313d0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
313e0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
313f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31400 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
31410 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
31420 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
31430 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
31440 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31450 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
31460 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
31470 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
31480 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
31490 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
314a0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
314b0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
314c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
314d0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
314e0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
314f0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
31500 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
31510 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
31520 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
31530 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
31540 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
31550 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
31560 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
31570 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
31580 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
31590 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
315a0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
315b0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
315c0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
315d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
315e0 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
315f0 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
31600 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
31610 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
31620 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
31630 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
31640 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
31650 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
31660 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
31670 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
31680 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
31690 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
316a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
316b0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
316c0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
316d0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
316e0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
316f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
31700 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
31710 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
31720 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
31730 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
31740 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
31750 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
31760 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
31770 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
31780 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
31790 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
317a0 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
317b0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
317c0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
317d0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
317e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
317f0 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
31800 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
31810 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
31820 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
31830 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31840 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
31850 70 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72  pPrevTrunk ? pPr
31860 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20  evTrunk->pgno : 
31870 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
31880 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
31890 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
318a0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
318b0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
318c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
318d0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
318e0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
318f0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
31900 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
31910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
31920 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
31930 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
31940 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20  aData!=0 );.    
31950 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
31960 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20  : R-13523-04394 
31970 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
31980 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
31990 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
319a0 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62    ** is the numb
319b0 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20  er of leaf page 
319c0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c  pointers to foll
319d0 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d  ow. */.      k =
319e0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
319f0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
31a00 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
31a10 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
31a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
31a30 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
31a40 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
31a50 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
31a60 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
31a70 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
31a80 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
31a90 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
31aa0 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
31ab0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
31ac0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
31ad0 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
31ae0 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
31af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31b00 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
31b10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
31b20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31b30 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
31b40 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
31b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31b60 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
31b70 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
31b80 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31b90 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
31ba0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
31bb0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
31bc0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
31bd0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
31be0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
31bf0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
31c00 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
31c10 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
31c20 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
31c30 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
31c40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
31c50 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
31c60 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
31c70 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
31c80 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
31c90 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
31ca0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31cb0 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
31cc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31cd0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
31ce0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31cf0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31d00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
31d10 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
31d20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
31d30 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
31d40 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
31d50 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
31d60 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
31d70 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
31d80 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
31d90 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
31da0 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
31db0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
31dc0 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
31dd0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
31de0 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
31df0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31e00 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
31e10 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
31e20 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
31e30 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
31e40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
31e50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31e60 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
31e70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
31e80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
31e90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31ea0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31eb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
31ec0 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
31ed0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
31ee0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
31ef0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
31f00 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
31f10 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31f20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
31f30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
31f40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31f50 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
31f60 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
31f70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31f80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31f90 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
31fa0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
31fb0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
31fc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
31fd0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
31fe0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
31ff0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
32000 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
32010 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32020 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
32030 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
32040 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
32050 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
32060 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
32070 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
32080 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
32090 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
320a0 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
320b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
320c0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
320d0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
320e0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
320f0 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
32100 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
32110 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
32120 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
32130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32140 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
32150 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
32160 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
32170 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e  RRUPT_PGNO(iTrun
32180 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
32190 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
321a0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
321b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
321c0 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
321d0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
321e0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
321f0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
32200 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
32210 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
32220 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
32230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32240 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32250 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32260 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32270 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32280 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32290 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
322a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
322b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
322c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
322d0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
322e0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
322f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32300 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32320 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
32330 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
32340 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
32350 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
32360 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
32370 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
32380 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
32390 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
323a0 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
323b0 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
323c0 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
323d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
323e0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
323f0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
32400 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
32410 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
32420 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
32430 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
32440 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
32450 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
32460 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
32470 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
32480 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
32490 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
324a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
324b0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
324c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
324d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
324e0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
324f0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32500 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
32510 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
32520 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
32530 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
32540 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
32550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
32560 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
32570 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
32580 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
32590 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
325a0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
325b0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
325c0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
325d0 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
325e0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
325f0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
32600 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
32610 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
32620 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
32630 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
32640 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
32650 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
32660 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
32670 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
32680 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
32690 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
326a0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f           if( eMo
326b0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
326c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
326d0 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
326e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
326f0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
32700 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  (&aData[8+i*4]);
32710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
32720 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79  f( iPage<=nearby
32730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32740 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
32750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32760 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
32770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
327a0 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
327b0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
327c0 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
327d0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
327e0 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  8]) - nearby);. 
327f0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
32800 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
32810 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
32820 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73   d2 = sqlite3Abs
32830 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
32840 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
32850 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
32860 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
32870 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
32880 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
32890 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
328a0 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
328b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
328c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
328d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
328e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
328f0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
32900 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
32910 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
32920 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
32930 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
32940 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
32950 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
32960 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
32970 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
32980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32990 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
329a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
329b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
329c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
329d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
329e0 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
329f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
32a00 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
32a10 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e      || (iPage==n
32a20 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c  earby || (iPage<
32a30 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
32a40 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
32a50 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
32a60 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
32a70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
32a80 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
32a90 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
32aa0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
32ab0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
32ac0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
32ad0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
32ae0 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
32af0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
32b00 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
32b10 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
32b20 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
32b30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32b40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32b50 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
32b60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
32b70 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
32b80 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
32b90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
32ba0 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
32bb0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
32bc0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
32bd0 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
32be0 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
32bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
32c00 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
32c10 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
32c20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
32c30 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
32c40 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20  t(pBt, *pPgno)? 
32c50 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
32c60 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
32c70 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
32c80 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
32c90 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
32ca0 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
32cb0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32cd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32ce0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
32cf0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
32d00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
32d10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32d30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
32d40 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
32d50 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
32d60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
32d70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32d80 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
32d90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
32da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
32db0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
32dc0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
32dd0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
32de0 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
32df0 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
32e00 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
32e10 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
32e20 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61  e freelist, so a
32e30 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65  ppend a new page
32e40 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
32e50 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
32e60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72     **.    ** Nor
32e70 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73  mally, new pages
32e80 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
32e90 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20  is block can be 
32ea0 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
32eb0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
32ec0 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
32ed0 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
32ee0 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65   set. This preve
32ef0 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  nts the pager.  
32f00 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
32f10 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
32f20 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  es content from 
32f30 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  disk. However, i
32f40 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  f the.    ** cur
32f50 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
32f60 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
32f70 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63   one or more inc
32f80 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a  remental-vacuum.
32f90 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68      ** steps, th
32fa0 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61  en the page we a
32fb0 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f  re about to allo
32fc0 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cate may contain
32fd0 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20   content.    ** 
32fe0 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
32ff0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
33000 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20   a rollback. In 
33010 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20  this case, do.  
33020 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65    ** not set the
33030 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67   no-content flag
33040 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
33050 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20  e pager to load 
33060 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  and journal.    
33070 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ** the current p
33080 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  age content befo
33090 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69  re overwriting i
330a0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
330b0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
330c0 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63  ager will not ac
330d0 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74  tually attempt t
330e0 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61  o load or journa
330f0 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  l .    ** conten
33100 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74  t for any page t
33110 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  hat really does 
33120 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  lie past the end
33130 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33140 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20  .    ** file on 
33150 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66  disk. So the eff
33160 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e  ects of disablin
33170 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  g the no-content
33180 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
33190 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f    ** here are co
331a0 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20  nfined to those 
331b0 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
331c0 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
331d0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  f the.    ** dat
331e0 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20  abase image and 
331f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
33200 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
33210 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f    */.    int bNo
33220 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66  Content = (0==If
33230 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
33240 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41  DoTruncate))? PA
33250 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
33260 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  T:0;..    rc = s
33270 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33280 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
33290 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
332a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
332b0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
332c0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
332d0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
332e0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
332f0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
33300 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33310 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
33320 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
33330 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
33340 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
33350 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
33360 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
33370 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
33380 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
33390 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
333a0 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
333b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
333c0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
333d0 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
333e0 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
333f0 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
33400 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
33410 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
33420 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
33430 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
33440 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
33450 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
33460 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
33470 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
33480 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
33490 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
334a0 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
334b0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
334c0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
334d0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
334e0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
334f0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
33500 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
33510 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
33520 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33540 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33550 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
33560 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
33570 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
33580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33590 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
335a0 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
335b0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
335c0 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
335d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
335e0 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
335f0 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
33600 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
33610 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
33620 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
33630 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
33640 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
33650 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
33660 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
33670 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
33680 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
33690 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
336a0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
336b0 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
336c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
336d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
336e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
336f0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
33700 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
33710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33720 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
33730 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
33740 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
33750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
33760 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
33770 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
33780 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
33790 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
337a0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
337b0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
337c0 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
337d0 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
337e0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
337f0 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
33800 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  runk);.  assert(
33810 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
33820 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
33830 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
33840 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d  age)->pDbPage)<=
33850 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  1 );.  assert( r
33860 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
33870 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
33880 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
33890 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
338a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
338b0 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
338c0 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
338d0 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
338e0 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
338f0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
33900 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
33910 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
33920 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
33930 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
33940 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
33950 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
33960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33970 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
33980 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
33990 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
339a0 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
339b0 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
339c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
339d0 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
339e0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
339f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
33a00 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
33a10 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
33a20 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
33a30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
33a40 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
33a50 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
33a60 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
33a70 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
33a80 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
33a90 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
33aa0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
33ab0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
33ac0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
33ad0 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
33ae0 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
33af0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
33b00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33b10 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
33b20 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
33b30 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
33b40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
33b50 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
33b60 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
33b70 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
33b80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
33b90 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
33ba0 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
33bb0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
33bc0 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
33bd0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
33be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33bf0 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
33c00 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
33c10 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
33c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
33c40 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
33c50 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
33c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c70 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
33c80 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
33c90 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
33ca0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
33cb0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
33cc0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
33cd0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
33ce0 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
33cf0 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
33d00 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
33d10 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
33d20 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75  ( iPage<2 ) retu
33d30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
33d40 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d  T_BKPT;.  if( pM
33d50 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
33d60 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
33d70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33d80 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
33d90 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
33da0 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
33db0 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
33dc0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
33dd0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
33de0 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
33df0 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
33e00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33e10 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
33e20 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
33e30 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
33e40 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
33e50 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
33e60 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
33e70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
33e80 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
33e90 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74  e+1);..  if( pBt
33ea0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
33eb0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
33ec0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
33ed0 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
33ee0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
33ef0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
33f00 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
33f10 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
33f20 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
33f30 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
33f40 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
33f50 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
33f60 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
33f70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
33f80 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
33f90 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
33fa0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
33fb0 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
33fc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
33fd0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
33fe0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
33ff0 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
34000 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
34010 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
34020 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
34030 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
34040 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
34050 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
34060 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
34070 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
34080 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
34090 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
340a0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
340b0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
340c0 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
340d0 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
340e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
340f0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34100 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
34110 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
34120 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
34130 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
34140 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
34150 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
34160 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
34170 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
34180 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
34190 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
341a0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
341b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
341c0 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
341d0 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
341e0 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
341f0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
34200 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
34210 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
34220 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
34230 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
34240 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
34250 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
34260 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
34270 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
34280 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
34290 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
342a0 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
342b0 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
342c0 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
342d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342e0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
342f0 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
34300 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
34310 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
34320 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
34330 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
34340 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
34350 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
34360 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
34370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34380 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
34390 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
343a0 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20     }..    nLeaf 
343b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
343c0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
343d0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
343e0 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b  usableSize>32 );
343f0 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e  .    if( nLeaf >
34400 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
34410 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
34420 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
34430 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
34440 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
34450 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
34460 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75    if( nLeaf < (u
34470 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
34480 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
34490 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
344a0 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
344b0 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
344c0 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
344d0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
344e0 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
344f0 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
34500 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
34510 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
34520 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
34530 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
34540 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
34550 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
34560 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
34570 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
34580 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
34590 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
345a0 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
345b0 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
345c0 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
345d0 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
345e0 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
345f0 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
34600 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
34610 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
34620 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
34630 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
34640 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
34650 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
34660 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
34670 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
34680 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
34690 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
346a0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
346b0 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
346c0 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * we will contin
346d0 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ue to restrict t
346e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
346f0 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
34700 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
34710 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
34720 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
34730 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
34740 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
34750 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
34760 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
34770 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
34780 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
34790 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
347a0 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
347b0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
347c0 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
347d0 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
347e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
347f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
34800 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65  19920-11576 Howe
34810 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69  ver, newer versi
34820 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74  ons of SQLite st
34830 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f  ill.      ** avo
34840 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73  id using the las
34850 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e  t six entries in
34860 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72   the freelist tr
34870 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69  unk page array i
34880 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
34890 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66   that database f
348a0 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20  iles created by 
348b0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
348c0 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a  f SQLite can be.
348d0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79        ** read by
348e0 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
348f0 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20  of SQLite..     
34900 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
34910 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34920 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
34930 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
34940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34950 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
34960 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
34970 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
34980 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
34990 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
349a0 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
349b0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
349c0 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  e && (pBt->btsFl
349d0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
349e0 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  _DELETE)==0 ){. 
349f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
34a00 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
34a10 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
34a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34a30 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
34a40 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
34a50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
34a60 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
34a70 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
34a80 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
34a90 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
34aa0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
34ab0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
34ac0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
34ad0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
34ae0 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
34af0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
34b00 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
34b10 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
34b20 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
34b30 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
34b40 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
34b50 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
34b60 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
34b70 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
34b80 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
34b90 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
34ba0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
34bb0 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
34bc0 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
34bd0 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
34be0 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
34bf0 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
34c00 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
34c10 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
34c20 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
34c30 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
34c40 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26   if( pPage==0 &&
34c50 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
34c60 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
34c70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
34c80 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  e, 0)) ){.    go
34c90 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34ca0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
34cb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34cc0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
34cd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34ce0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
34cf0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
34d00 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
34d10 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
34d20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
34d30 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
34d40 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
34d50 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
34d60 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
34d70 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
34d80 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
34d90 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
34da0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
34db0 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
34dc0 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
34dd0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
34de0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
34df0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
34e00 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
34e10 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
34e20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
34e30 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
34e40 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
34e50 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
34e60 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
34e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
34e80 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
34e90 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
34ea0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
34eb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
34ec0 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
34ed0 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
34ee0 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
34ef0 65 6c 6c 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 73  ell.  Store.** s
34f00 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ize information 
34f10 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 69  about the cell i
34f20 6e 20 70 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74  n pInfo..*/.stat
34f30 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
34f40 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
34f50 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
34f60 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
34f70 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20  ntains the Cell 
34f80 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
34f90 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a  ar *pCell,    /*
34fa0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
34fb0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c  he Cell */.  Cel
34fc0 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
34fd0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e        /* Size in
34fe0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
34ff0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
35000 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a   BtShared *pBt;.
35010 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
35020 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
35030 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
35040 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
35050 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
35060 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
35070 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
35080 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
35090 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
350a0 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , pInfo);.  if( 
350b0 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70  pInfo->nLocal==p
350c0 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29  Info->nPayload )
350d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
350e0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
350f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
35100 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
35110 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
35120 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
35130 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e  pCell + pInfo->n
35140 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 2d 3e 61  Size == pPage->a
35150 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 74 65 73  DataEnd );.  tes
35160 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b 20 28  tcase( pCell + (
35170 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 29 20  pInfo->nSize-1) 
35180 3d 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  == pPage->aDataE
35190 6e 64 20 29 3b 0a 20 20 69 66 28 20 70 43 65 6c  nd );.  if( pCel
351a0 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  l + pInfo->nSize
351b0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45   > pPage->aDataE
351c0 6e 64 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c  nd ){.    /* Cel
351d0 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65  l extends past e
351e0 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20  nd of page */.  
351f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35200 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
35210 67 65 29 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  ge);.  }.  ovflP
35220 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
35230 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53  Cell + pInfo->nS
35240 69 7a 65 20 2d 20 34 29 3b 0a 20 20 70 42 74 20  ize - 4);.  pBt 
35250 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
35260 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
35270 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
35280 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
35290 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
352a0 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
352b0 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
352c0 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  - pInfo->nLocal 
352d0 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
352e0 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
352f0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66  ;.  assert( nOvf
35300 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52  l>0 || .    (COR
35310 52 55 50 54 5f 44 42 20 26 26 20 28 70 49 6e 66  RUPT_DB && (pInf
35320 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76  o->nPayload + ov
35330 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c  flPageSize)<ovfl
35340 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20  PageSize).  );. 
35350 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
35360 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
35370 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
35380 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
35390 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
353a0 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
353b0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
353c0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
353d0 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
353e0 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
353f0 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
35400 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
35410 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
35420 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
35430 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
35440 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
35450 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
35460 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
35470 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
35480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
35490 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
354a0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
354b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
354c0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
354d0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
354e0 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
354f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
35500 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
35510 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
35520 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
35530 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
35540 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
35550 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
35560 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
35570 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
35580 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
35590 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
355a0 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
355b0 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
355c0 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
355d0 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
355e0 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
355f0 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
35600 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
35610 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
35620 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
35630 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
35640 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
35650 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
35660 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
35670 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
35680 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
35690 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
356a0 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
356b0 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
356c0 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
356d0 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
356e0 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
356f0 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
35700 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
35710 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
35720 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
35730 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
35740 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
35750 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
35760 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
35770 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
35780 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
35790 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
357a0 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
357b0 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
357c0 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
357d0 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
357e0 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
357f0 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
35800 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
35810 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
35820 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
35830 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
35840 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
35850 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
35860 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
35870 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
35880 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35890 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
358a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
358b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
358c0 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
358d0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
358e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
358f0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
35900 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
35910 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
35920 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
35930 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
35940 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
35950 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
35960 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
35970 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
35980 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
35990 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
359a0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
359b0 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
359c0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
359d0 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
359e0 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
359f0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
35a00 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
35a10 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
35a20 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
35a30 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
35a40 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
35a50 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
35a60 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
35a70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
35a80 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
35a90 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
35aa0 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
35ab0 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
35ac0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
35ad0 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
35ae0 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
35af0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
35b00 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
35b10 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
35b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
35b30 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
35b40 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
35b50 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35b60 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
35b70 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
35b80 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
35b90 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65 65 50  /.  const BtreeP
35ba0 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20 20  ayload *pX,     
35bb0 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69     /* Payload wi
35bc0 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73  th which to cons
35bd0 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c 20 2a  truct the cell *
35be0 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
35bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c00 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
35c10 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
35c20 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
35c30 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
35c40 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
35c50 2c 20 72 63 2c 20 6d 6e 3b 0a 20 20 69 6e 74 20  , rc, mn;.  int 
35c60 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
35c70 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
35c80 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
35c90 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
35ca0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
35cb0 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
35cc0 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67   *pBt;.  Pgno pg
35cd0 6e 6f 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6e 48  noOvfl;.  int nH
35ce0 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  eader;..  assert
35cf0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
35d00 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
35d10 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
35d20 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
35d30 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
35d40 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
35d50 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
35d60 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
35d70 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
35d80 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
35d90 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
35da0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
35db0 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
35dc0 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
35dd0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
35de0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
35df0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
35e00 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
35e10 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
35e20 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Page) );..  /* F
35e30 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
35e40 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
35e50 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  = pPage->childPt
35e60 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 61  rSize;.  if( pPa
35e70 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
35e80 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d    nPayload = pX-
35e90 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65  >nData + pX->nZe
35ea0 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ro;.    pSrc = p
35eb0 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e 53  X->pData;.    nS
35ec0 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a  rc = pX->nData;.
35ed0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
35ee0 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b  e->intKeyLeaf );
35ef0 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29   /* fillInCell()
35f00 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72   only called for
35f10 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e   leaves */.    n
35f20 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
35f30 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
35f40 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
35f50 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  ;.    nHeader +=
35f60 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
35f70 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
35f80 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20  4*)&pX->nKey);. 
35f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
35fa0 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78  rt( pX->nKey<=0x
35fb0 37 66 66 66 66 66 66 66 20 26 26 20 70 58 2d 3e  7fffffff && pX->
35fc0 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e  pKey!=0 );.    n
35fd0 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d  Src = nPayload =
35fe0 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a   (int)pX->nKey;.
35ff0 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70      pSrc = pX->p
36000 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64 65 72  Key;.    nHeader
36010 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
36020 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
36030 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a   nPayload);.  }.
36040 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
36050 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
36060 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
36070 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 69  ll[nHeader];.  i
36080 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
36090 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
360a0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
360b0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
360c0 68 65 72 65 20 65 76 65 72 79 74 68 69 6e 67 20  here everything 
360d0 66 69 74 73 20 6f 6e 20 74 68 65 20 62 74 72 65  fits on the btre
360e0 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 61 6e  e page.    ** an
360f0 64 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  d no overflow pa
36100 67 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ges are required
36110 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d 20 6e 48 65  . */.    n = nHe
36120 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b  ader + nPayload;
36130 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
36140 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==3 );.    testc
36150 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20  ase( n==4 );.   
36160 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34   if( n<4 ) n = 4
36170 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
36180 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  n;.    assert( n
36190 53 72 63 3c 3d 6e 50 61 79 6c 6f 61 64 20 29 3b  Src<=nPayload );
361a0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
361b0 53 72 63 3c 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  Src<nPayload );.
361c0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
361d0 6f 61 64 2c 20 70 53 72 63 2c 20 6e 53 72 63 29  oad, pSrc, nSrc)
361e0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  ;.    memset(pPa
361f0 79 6c 6f 61 64 2b 6e 53 72 63 2c 20 30 2c 20 6e  yload+nSrc, 0, n
36200 50 61 79 6c 6f 61 64 2d 6e 53 72 63 29 3b 0a 20  Payload-nSrc);. 
36210 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36220 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
36230 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
36240 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
36250 74 68 61 74 20 73 6f 6d 65 20 6f 66 20 74 68 65  that some of the
36260 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 6e 65   content will ne
36270 65 64 0a 20 20 2a 2a 20 74 6f 20 73 70 69 6c 6c  ed.  ** to spill
36280 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
36290 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 6d 6e 20  ages..  */.  mn 
362a0 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
362b0 6c 3b 0a 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e  l;.  n = mn + (n
362c0 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20  Payload - mn) % 
362d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
362e0 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
362f0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
36300 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
36310 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
36320 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
36330 20 29 3b 0a 20 20 69 66 28 20 6e 20 3e 20 70 50   );.  if( n > pP
36340 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20  age->maxLocal ) 
36350 6e 20 3d 20 6d 6e 3b 0a 20 20 73 70 61 63 65 4c  n = mn;.  spaceL
36360 65 66 74 20 3d 20 6e 3b 0a 20 20 2a 70 6e 53 69  eft = n;.  *pnSi
36370 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72  ze = n + nHeader
36380 20 2b 20 34 3b 0a 20 20 70 50 72 69 6f 72 20 3d   + 4;.  pPrior =
36390 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b   &pCell[nHeader+
363a0 6e 5d 3b 0a 20 20 70 54 6f 52 65 6c 65 61 73 65  n];.  pToRelease
363b0 20 3d 20 30 3b 0a 20 20 70 67 6e 6f 4f 76 66 6c   = 0;.  pgnoOvfl
363c0 20 3d 20 30 3b 0a 20 20 70 42 74 20 3d 20 70 50   = 0;.  pBt = pP
363d0 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20  age->pBt;..  /* 
363e0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61  At this point va
363f0 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62  riables should b
36400 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
36410 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50  :.  **.  **   nP
36420 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
36430 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   Total payload s
36440 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a  ize in bytes.  *
36450 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20  *   pPayload    
36460 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69         Begin wri
36470 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72  ting payload her
36480 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65  e.  **   spaceLe
36490 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63  ft          Spac
364a0 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70  e available at p
364b0 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61  Payload.  If nPa
364c0 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c  yload>spaceLeft,
364d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
364e0 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
364f0 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75  means content mu
36500 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76  st spill into ov
36510 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
36520 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20  **   *pnSize    
36530 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20          Size of 
36540 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28  the local cell (
36550 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65  not counting ove
36560 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a  rflow pages).  *
36570 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20  *   pPrior      
36580 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20         Where to 
36590 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f  write the pgno o
365a0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
365b0 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20  flow page.  **. 
365c0 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74   ** Use a call t
365d0 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
365e0 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20  Ptr() to verify 
365f0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
36600 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20  above.  ** were 
36610 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74  computed correct
36620 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ly..  */.#ifdef 
36630 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
36640 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
36650 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78  fo;.    pPage->x
36660 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
36670 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
36680 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61      assert( nHea
36690 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  der==(int)(info.
366a0 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
366b0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
366c0 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e   info.nKey==pX->
366d0 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65  nKey );.    asse
366e0 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69  rt( *pnSize == i
366f0 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20  nfo.nSize );.   
36700 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65   assert( spaceLe
36710 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  ft == info.nLoca
36720 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  l );.  }.#endif.
36730 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
36740 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65  payload into the
36750 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20   local Cell and 
36760 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f  any extra into o
36770 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
36780 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
36790 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
367a0 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
367b0 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
367c0 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
367d0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
367e0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
367f0 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
36800 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
36810 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
36820 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
36830 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
36840 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
36850 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
36860 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
36870 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36880 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
36890 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
368a0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
368b0 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
368c0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
368d0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
368e0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
368f0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
36900 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
36910 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
36920 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
36930 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
36940 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
36950 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
36960 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
36970 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
36980 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
36990 20 20 20 20 69 66 28 20 6e 53 72 63 3e 3d 6e 20      if( nSrc>=n 
369a0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
369b0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
369c0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n);.    }else if
369d0 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
369e0 20 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20    n = nSrc;.    
369f0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
36a00 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
36a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
36a20 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
36a30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
36a40 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
36a50 20 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c     if( nPayload<
36a60 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
36a70 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
36a80 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
36a90 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
36aa0 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
36ab0 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
36ac0 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d  ft==0 ){.      M
36ad0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
36ae0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
36af0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
36b00 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
36b10 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
36b20 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
36b30 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
36b40 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
36b50 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
36b60 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
36b70 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
36b80 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
36b90 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
36ba0 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
36bb0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
36bc0 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
36bd0 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
36be0 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
36bf0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
36c00 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
36c10 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
36c20 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
36c30 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
36c40 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
36c50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36c60 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
36c70 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
36c80 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
36c90 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
36ca0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
36cb0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
36cc0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
36cd0 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
36ce0 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
36cf0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
36d00 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
36d10 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
36d20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
36d30 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
36d40 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
36d50 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
36d60 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
36d70 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
36d80 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
36d90 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
36da0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
36db0 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
36dc0 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
36dd0 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
36de0 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
36df0 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
36e00 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
36e10 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
36e20 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  nitialized value
36e30 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
36e40 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
36e50 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
36e60 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
36e70 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
36e80 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
36e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36ea0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
36eb0 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
36ec0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
36ed0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
36ee0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
36ef0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
36f00 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
36f10 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
36f20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
36f30 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
36f40 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
36f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
36f60 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
36f70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
36f80 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
36f90 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
36fa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36fb0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
36fc0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
36fd0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
36fe0 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
36ff0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
37000 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
37010 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
37020 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
37030 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
37040 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
37050 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
37060 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
37070 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
37080 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
37090 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
370a0 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
370b0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
370c0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
370d0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
370e0 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
370f0 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
37100 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
37110 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
37120 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
37130 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
37140 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
37150 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
37160 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
37170 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
37180 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
37190 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
371a0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
371b0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
371c0 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
371d0 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
371e0 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
371f0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
37200 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
37210 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
37220 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
37230 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
37240 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
37250 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
37260 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
37270 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
37280 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
37290 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
372a0 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
372b0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
372c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
372d0 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
372e0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
372f0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
37300 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
37310 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
37320 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
37330 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
37340 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
37350 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
37360 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
37370 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
37380 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
37390 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
373a0 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
373b0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
373c0 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
373d0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
373e0 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
373f0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
37400 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
37410 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b  *pRC){.  u32 pc;
37420 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
37430 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
37440 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
37450 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
37460 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
37470 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
37480 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
37490 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
374a0 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
374b0 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
374c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
374d0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
374e0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68   code */.  int h
374f0 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65  dr;        /* Be
37500 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68  ginning of the h
37510 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70  eader.  0 most p
37520 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20  ages.  100 page 
37530 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  1 */..  if( *pRC
37540 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
37550 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
37560 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
37570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
37580 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63  RUPT_DB || sz==c
37590 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
375a0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
375b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
375c0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
375d0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
375e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
375f0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
37600 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
37610 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
37620 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
37630 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
37640 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
37650 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
37660 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
37670 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
37680 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
37690 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
376a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
376b0 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
376c0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
376d0 69 66 28 20 70 63 2b 73 7a 20 3e 20 70 50 61 67  if( pc+sz > pPag
376e0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
376f0 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
37700 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
37710 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
37720 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
37730 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
37740 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
37750 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
37760 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
37770 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
37780 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  --;.  if( pPage-
37790 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
377a0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
377b0 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20  r+1], 0, 4);.   
377c0 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
377d0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
377e0 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61  data[hdr+5], pPa
377f0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
37800 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize);.    pPage-
37810 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
37820 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
37830 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  - pPage->hdrOffs
37840 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  et.             
37850 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67            - pPag
37860 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
37870 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  - 8;.  }else{.  
37880 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70    memmove(ptr, p
37890 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e  tr+2, 2*(pPage->
378a0 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20  nCell - idx));. 
378b0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
378c0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
378d0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
378e0 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
378f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
37900 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
37910 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
37920 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
37930 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
37940 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
37950 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
37960 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
37970 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
37980 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
37990 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
379a0 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
379b0 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
379c0 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
379d0 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
379e0 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
379f0 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
37a00 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
37a10 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
37a20 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
37a30 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64  ge->apOvfl[] and
37a40 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
37a50 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
37a60 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
37a70 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
37a80 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
37a90 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
37aa0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
37ab0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
37ac0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
37ad0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
37ae0 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
37af0 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
37b00 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  mented..**.** *p
37b10 52 43 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54  RC must be SQLIT
37b20 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 72  E_OK when this r
37b30 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
37b40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37b50 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
37b60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
37b70 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
37b80 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
37b90 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
37ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
37bb0 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
37bc0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
37bd0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
37be0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
37bf0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
37c00 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
37c10 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
37c20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
37c30 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
37c40 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
37c50 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
37c60 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
37c70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
37c80 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
37c90 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
37ca0 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
37cb0 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
37cc0 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
37cd0 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
37ce0 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
37cf0 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
37d00 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
37d10 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
37d20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
37d30 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
37d40 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
37d50 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
37d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
37d70 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
37d80 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
37d90 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
37da0 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
37db0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b  e */.  u8 *pIns;
37dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
37dd0 70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e  point in pPage->
37de0 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65  aCellIdx[] where
37df0 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65   no cell inserte
37e00 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
37e10 2a 70 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRC==SQLITE_OK 
37e20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  );.  assert( i>=
37e30 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
37e40 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
37e50 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
37e60 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  t( MX_CELL(pPage
37e70 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b  ->pBt)<=10921 );
37e80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37e90 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
37ea0 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20  (pPage->pBt) || 
37eb0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
37ec0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
37ed0 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
37ee0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
37ef0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
37f00 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
37f10 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53  >apOvfl)==ArrayS
37f20 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66  ize(pPage->aiOvf
37f30 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
37f40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
37f50 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
37f60 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
37f70 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f  e cell should no
37f80 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20  rmally be sized 
37f90 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65  correctly.  Howe
37fa0 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67  ver, when moving
37fb0 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65   a.  ** malforme
37fc0 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  d cell from a le
37fd0 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e  af page to an in
37fe0 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20  terior page, if 
37ff0 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20  the cell size.  
38000 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20  ** wanted to be 
38010 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20  less than 4 but 
38020 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74  got rounded up t
38030 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  o 4 on the leaf,
38040 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20   then size.  ** 
38050 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
38060 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20  an 8 (leaf-size 
38070 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68  + pointer) on th
38080 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  e interior node.
38090 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65    Hence.  ** the
380a0 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20   term after the 
380b0 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  || in the follow
380c0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f  ing assert(). */
380d0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70  .  assert( sz==p
380e0 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
380f0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
38100 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
38110 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
38120 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
38130 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
38140 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
38150 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
38160 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c  mcpy(pTemp, pCel
38170 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43  l, sz);.      pC
38180 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
38190 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
381a0 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
381b0 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
381c0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
381d0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
381e0 6f 77 2b 2b 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d  ow++;.    /* Com
381f0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
38200 41 72 72 61 79 53 69 7a 65 2d 31 20 73 69 6e 63  ArraySize-1 sinc
38210 65 20 77 65 20 68 6f 6c 64 20 62 61 63 6b 20 6f  e we hold back o
38220 6e 65 20 65 78 74 72 61 20 73 6c 6f 74 0a 20 20  ne extra slot.  
38230 20 20 2a 2a 20 61 73 20 61 20 63 6f 6e 74 69 6e    ** as a contin
38240 67 65 6e 63 79 2e 20 20 49 6e 20 6f 74 68 65 72  gency.  In other
38250 20 77 6f 72 64 73 2c 20 6e 65 76 65 72 20 6e 65   words, never ne
38260 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 33 20 6f  ed more than 3 o
38270 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 73  verflow.    ** s
38280 6c 6f 74 73 20 62 75 74 20 34 20 61 72 65 20 61  lots but 4 are a
38290 6c 6c 6f 63 61 74 65 64 2c 20 6a 75 73 74 20 74  llocated, just t
382a0 6f 20 62 65 20 73 61 66 65 2e 20 2a 2f 0a 20 20  o be safe. */.  
382b0 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20 41 72    assert( j < Ar
382c0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
382d0 70 4f 76 66 6c 29 2d 31 20 29 3b 0a 20 20 20 20  pOvfl)-1 );.    
382e0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
382f0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
38300 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
38310 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a   (u16)i;..    /*
38320 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f   When multiple o
38330 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20  verflows occur, 
38340 74 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20  they are always 
38350 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69  sequential and i
38360 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20  n.    ** sorted 
38370 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76  order.  This inv
38380 61 72 69 61 6e 74 73 20 61 72 69 73 65 20 62 65  ariants arise be
38390 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f  cause multiple o
383a0 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20  verflows can.   
383b0 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77   ** only occur w
383c0 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69  hen inserting di
383d0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
383e0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
383f0 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62   during.    ** b
38400 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68  alancing, and th
38410 65 20 64 69 76 69 64 65 72 73 20 61 72 65 20 61  e dividers are a
38420 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74  djacent and sort
38430 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ed..    */.    a
38440 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70  ssert( j==0 || p
38450 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
38460 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f  ]<(u16)i ); /* O
38470 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74  verflows in sort
38480 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ed order */.    
38490 61 73 73 65 72 74